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>
40 struct sockaddr_storage sin;
41 memset(&sin, 0,
sizeof(sin));
42 socklen_t sin_len =
sizeof(sin);
43 SOCKET s = accept(ls, (
struct sockaddr*)&sin, &sin_len);
44 if (s == INVALID_SOCKET)
return;
46 sin_len = FixAddrLenForEmscripten(sin);
64 DEBUG(net, 1,
"[%s] Banned ip tried to join (%s), refused", Tsocket::GetName(), entry.c_str());
66 if (send(s, (
const char*)p.
buffer, p.
size, 0) < 0) {
67 DEBUG(net, 0,
"send failed with error %d", GET_LAST_ERROR());
77 if (!Tsocket::AllowConnection()) {
83 if (send(s, (
const char*)p.
buffer, p.
size, 0) < 0) {
84 DEBUG(net, 0,
"send failed with error %d", GET_LAST_ERROR());
91 Tsocket::AcceptConnection(s, address);
101 fd_set read_fd, write_fd;
108 for (Tsocket *cs : Tsocket::Iterate()) {
109 FD_SET(cs->sock, &read_fd);
110 FD_SET(cs->sock, &write_fd);
115 FD_SET(s.second, &read_fd);
118 tv.tv_sec = tv.tv_usec = 0;
119 if (select(FD_SETSIZE, &read_fd, &write_fd,
nullptr, &tv) < 0)
return false;
123 if (FD_ISSET(s.second, &read_fd))
AcceptClient(s.second);
127 for (Tsocket *cs : Tsocket::Iterate()) {
128 cs->writable = !!FD_ISSET(cs->sock, &write_fd);
129 if (FD_ISSET(cs->sock, &read_fd)) {
130 cs->ReceivePackets();
149 address.Listen(SOCK_STREAM, &
sockets);
153 DEBUG(net, 0,
"[server] could not start network: could not create listening socket");
154 NetworkError(STR_NETWORK_ERROR_SERVER_START);
165 closesocket(s.second);
168 DEBUG(net, 1,
"[%s] closed listeners", Tsocket::GetName());