14 #ifndef NETWORK_CORE_TCP_LISTEN_H
15 #define NETWORK_CORE_TCP_LISTEN_H
18 #include "../network.h"
19 #include "../../core/pool_type.hpp"
20 #include "../../debug.h"
21 #include "table/strings.h"
31 template <
class Tsocket, PacketType Tfull_packet, PacketType Tban_packet>
44 struct sockaddr_storage sin;
45 memset(&sin, 0,
sizeof(sin));
46 socklen_t sin_len =
sizeof(sin);
47 SOCKET s = accept(ls, (
struct sockaddr*)&sin, &sin_len);
48 if (s == INVALID_SOCKET)
return;
65 DEBUG(net, 1,
"[%s] Banned ip tried to join (%s), refused", Tsocket::GetName(), *iter);
67 if (send(s, (
const char*)p.
buffer, p.
size, 0) < 0) {
68 DEBUG(net, 0,
"send failed with error %d", GET_LAST_ERROR());
78 if (!Tsocket::AllowConnection()) {
84 if (send(s, (
const char*)p.
buffer, p.
size, 0) < 0) {
85 DEBUG(net, 0,
"send failed with error %d", GET_LAST_ERROR());
92 Tsocket::AcceptConnection(s, address);
102 fd_set read_fd, write_fd;
110 FOR_ALL_ITEMS_FROM(Tsocket, idx, cs, 0) {
111 FD_SET(cs->sock, &read_fd);
112 FD_SET(cs->sock, &write_fd);
117 FD_SET(s->second, &read_fd);
120 tv.tv_sec = tv.tv_usec = 0;
121 #if !defined(__MORPHOS__) && !defined(__AMIGA__)
122 if (select(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv) < 0)
return false;
124 if (WaitSelect(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv, NULL) < 0)
return false;
129 if (FD_ISSET(s->second, &read_fd))
AcceptClient(s->second);
133 FOR_ALL_ITEMS_FROM(Tsocket, idx, cs, 0) {
134 cs->writable = !!FD_ISSET(cs->sock, &write_fd);
135 if (FD_ISSET(cs->sock, &read_fd)) {
136 cs->ReceivePackets();
154 for (
NetworkAddress *address = addresses.Begin(); address != addresses.End(); address++) {
155 address->Listen(SOCK_STREAM, &
sockets);
159 DEBUG(net, 0,
"[server] could not start network: could not create listening socket");
160 NetworkError(STR_NETWORK_ERROR_SERVER_START);
171 closesocket(s->second);
174 DEBUG(net, 1,
"[%s] closed listeners", Tsocket::GetName());