--- lbbs/src/net_server.c 2005/03/20 17:37:14 1.10 +++ lbbs/src/net_server.c 2005/05/07 09:28:12 1.11 @@ -17,6 +17,7 @@ #include "common.h" #include "io.h" +#include "tcplib.h" #include #include #include @@ -24,9 +25,11 @@ int net_server (const char *hostaddr, unsigned int port) { - int namelen, seq, netint; + int namelen, seq, netint, result, flags; struct sockaddr_in sin; char temp[256]; + fd_set testfds; + struct timeval timeout; socket_server = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); @@ -62,12 +65,45 @@ net_server (const char *hostaddr, unsign namelen = sizeof (sin); while (1) { - if ((socket_client = - accept (socket_server, (struct sockaddr *) &sin, &namelen)) < 0) - { - log_error ("Accept connection error\n"); - continue; - } + FD_ZERO (&testfds); + FD_SET (socket_server, &testfds); + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + result = SignalSafeSelect (FD_SETSIZE, &testfds, NULL, NULL, &timeout); + if (result < 0) + { + log_error ("Accept connection error\n"); + continue; + } + + if (result == 0) + { + continue; + } + + if (FD_ISSET (socket_server, &testfds)) + { + flags = fcntl (socket_server, F_GETFL, 0); + fcntl (socket_server, F_SETFL, flags | O_NONBLOCK); + while ((socket_client = + accept (socket_server, (struct sockaddr *) &sin, &namelen)) < 0) + { + if (errno != EWOULDBLOCK && errno != ECONNABORTED && errno != EINTR) + { + log_error ("Accept connection error\n"); + break; + } + } + fcntl (socket_server, F_SETFL, flags); + } + + if (socket_client < 0) + { + log_error ("Accept connection error\n"); + continue; + } strcpy (hostaddr_client, (const char *) inet_ntoa (sin.sin_addr)); port_client = ntohs (sin.sin_port);