12 #ifndef NETWORK_CORE_TCP_LISTEN_H
13 #define NETWORK_CORE_TCP_LISTEN_H
16 #include "../network.h"
17 #include "../../core/pool_type.hpp"
18 #include "../../debug.h"
19 #include "table/strings.h"
27 template <
class Tsocket, PacketType Tfull_packet, PacketType Tban_packet>
41 Debug(net, 2,
"[{}] Banned ip tried to join ({}), refused", Tsocket::GetName(), entry);
52 if (!Tsocket::AllowConnection()) {
76 struct sockaddr_storage sin;
77 memset(&sin, 0,
sizeof(sin));
78 socklen_t sin_len =
sizeof(sin);
79 SOCKET s = accept(ls, (
struct sockaddr*)&sin, &sin_len);
80 if (s == INVALID_SOCKET)
return;
82 sin_len = FixAddrLenForEmscripten(sin);
92 if (!Tsocket::ValidateClient(s, address))
continue;
93 Tsocket::AcceptConnection(s, address);
103 fd_set read_fd, write_fd;
110 for (Tsocket *cs : Tsocket::Iterate()) {
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 (select(FD_SETSIZE, &read_fd, &write_fd,
nullptr, &tv) < 0)
return false;
125 if (FD_ISSET(s.second, &read_fd))
AcceptClient(s.second);
129 for (Tsocket *cs : Tsocket::Iterate()) {
130 cs->writable = !!FD_ISSET(cs->sock, &write_fd);
131 if (FD_ISSET(cs->sock, &read_fd)) {
132 cs->ReceivePackets();
151 address.Listen(SOCK_STREAM, &
sockets);
155 Debug(net, 0,
"Could not start network: could not create listening socket");
156 ShowNetworkError(STR_NETWORK_ERROR_SERVER_START);
167 closesocket(s.second);
170 Debug(net, 5,
"[{}] Closed listeners", Tsocket::GetName());