static int open_listen_socket( int port )
{
- int listenfd;
- struct sockaddr_in serv_addr = {0};
- listenfd = socket( AF_INET, SOCK_STREAM, 0 );
+ int listenfd;
+ struct sockaddr_in serv_addr = {0};
+ listenfd = socket( AF_INET, SOCK_STREAM, 0 );
if( listenfd == -1 )
{
return -1;
}
+ if( setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int) ) < 0 )
+ {
+ fprintf( stderr, "setsockopt() error: %s\n", strerror(errno) );
+ close( listenfd );
+ return -1;
+ }
+
if( fcntl( listenfd, F_SETFL, O_NONBLOCK ) == -1 )
{
fprintf( stderr, "fcntl() error: %s\n", strerror(errno) );
+ close( listenfd );
return -1;
}
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = htonl( INADDR_ANY );
- serv_addr.sin_port = htons( port );
+ serv_addr.sin_family = AF_INET;
+ serv_addr.sin_addr.s_addr = htonl( INADDR_ANY );
+ serv_addr.sin_port = htons( port );
- if( bind( listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr) ) == -1 )
+ if( bind( listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr) ) == -1 )
{
fprintf( stderr, "bind() error: %s\n", strerror(errno) );
+ close( listenfd );
return -1;
}
- if( listen( listenfd, 10 ) == -1 )
+ if( listen( listenfd, 10 ) == -1 )
{
fprintf( stderr, "listen() error: %s\n", strerror(errno) );
+ close( listenfd );
return -1;
}
int ticks_without_action = 0;
- while( _run_server )
- {
+ while( _run_server )
+ {
_accept_any_new_client( listenfd, s2n_conf );
_process_handshakes();
_process_shutdowns();
spec.tv_sec = 0;
spec.tv_nsec = 50000000; /* 0.05s (20 tick)*/
nanosleep( &spec, NULL );
- }
+ }
printf( "Closing active connections\n" );
while(1)