summaryrefslogtreecommitdiff
path: root/source/net_common.c
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2008-08-28 17:35:47 +0000
committerAndrey Nazarov <skuller@skuller.net>2008-08-28 17:35:47 +0000
commit8d466c8c99a82c9fa87d2c8a932413da1ac89e04 (patch)
tree9954623456ae4dc245daa98f57f913f9892a742b /source/net_common.c
parent651dbdd53d61b75108ffdc95f3efdb285adc7170 (diff)
Removed unimplemented `sv_mvd_wait' cvar.
Bind server TCP socket with SO_REUSEADDR option, close it properly on shutdown. Implemented server console logging over HTTP, accessible at `/console' URI. Added `sv_console_auth' cvar controlling access to server console. Never allow server realtime go back. Spectator chat on GTV is no longer audible. Moved POV name on the very top of the screen.
Diffstat (limited to 'source/net_common.c')
-rw-r--r--source/net_common.c49
1 files changed, 36 insertions, 13 deletions
diff --git a/source/net_common.c b/source/net_common.c
index 3db96f8..eb8964b 100644
--- a/source/net_common.c
+++ b/source/net_common.c
@@ -677,10 +677,10 @@ fail:
return INVALID_SOCKET;
}
-static SOCKET TCP_OpenSocket( const char *interface, int port ) {
+static SOCKET TCP_OpenSocket( const char *interface, int port, netsrc_t who ) {
SOCKET newsocket;
struct sockaddr_in address;
- u_long _true = 1;
+ u_long _true;
if( !interface || !interface[0] ) {
interface = "localhost";
@@ -695,10 +695,21 @@ static SOCKET TCP_OpenSocket( const char *interface, int port ) {
}
// make it non-blocking
+ _true = 1;
if( ioctlsocket( newsocket, FIONBIO, &_true ) == -1 ) {
goto fail;
}
+ // give it a chance to reuse previous port
+ if( who == NS_SERVER ) {
+ _true = 1;
+ if( setsockopt( newsocket, SOL_SOCKET, SO_REUSEADDR,
+ ( char * )&_true, sizeof( _true ) ) == -1 )
+ {
+ goto fail;
+ }
+ }
+
if( !NET_StringToIface( interface, &address ) ) {
Com_Printf( "Bad interface address: %s\n", interface );
goto fail;
@@ -797,7 +808,7 @@ neterr_t NET_Listen( qboolean arg ) {
return NET_OK;
}
- tcp_socket = TCP_OpenSocket( net_ip->string, net_port->integer );
+ tcp_socket = TCP_OpenSocket( net_ip->string, net_port->integer, NS_SERVER );
if( tcp_socket == INVALID_SOCKET ) {
return NET_ERROR;
}
@@ -867,7 +878,7 @@ neterr_t NET_Connect( const netadr_t *peer, netstream_t *s ) {
struct sockaddr_in address;
int ret;
- socket = TCP_OpenSocket( net_ip->string, net_clientport->integer );
+ socket = TCP_OpenSocket( net_ip->string, net_clientport->integer, NS_CLIENT );
if( socket == INVALID_SOCKET ) {
return NET_ERROR;
}
@@ -1065,6 +1076,21 @@ static void NET_DumpHostInfo( struct hostent *h ) {
}
}
+static void dump_socket( SOCKET s, const char *s1, const char *s2 ) {
+ struct sockaddr_in sockaddr;
+ socklen_t len;
+ netadr_t adr;
+
+ len = sizeof( sockaddr );
+ if( getsockname( s, ( struct sockaddr * )&sockaddr, &len ) == -1 ) {
+ NET_GET_ERROR();
+ Com_EPrintf( "%s: getsockname: %s\n", __func__, NET_ErrorString() );
+ return;
+ }
+ NET_SockadrToNetadr( &sockaddr, &adr );
+ Com_Printf( "%s %s socket bound to %s\n", s1, s2, NET_AdrToString( &adr ) );
+}
+
/*
====================
NET_ShowIP_f
@@ -1073,17 +1099,16 @@ NET_ShowIP_f
static void NET_ShowIP_f( void ) {
char buffer[256];
struct hostent *h;
- struct sockaddr_in address;
- socklen_t length;
- netadr_t adr;
netsrc_t sock;
if( gethostname( buffer, sizeof( buffer ) ) == -1 ) {
+ NET_GET_ERROR();
Com_EPrintf( "%s: gethostname: %s\n", __func__, NET_ErrorString() );
return;
}
if( !( h = gethostbyname( buffer ) ) ) {
+ NET_GET_ERROR();
Com_EPrintf( "%s: gethostbyname: %s\n", __func__, NET_ErrorString() );
return;
}
@@ -1092,14 +1117,12 @@ static void NET_ShowIP_f( void ) {
for( sock = 0; sock < NS_COUNT; sock++ ) {
if( udp_sockets[sock] != INVALID_SOCKET ) {
- length = sizeof( address );
- getsockname( udp_sockets[sock], ( struct sockaddr * )&address,
- &length );
- NET_SockadrToNetadr( &address, &adr );
- Com_Printf( "%s bound to %s\n", socketNames[sock],
- NET_AdrToString( &adr ) );
+ dump_socket( udp_sockets[sock], socketNames[sock], "UDP" );
}
}
+ if( tcp_socket != INVALID_SOCKET ) {
+ dump_socket( tcp_socket, socketNames[NS_SERVER], "TCP" );
+ }
}
/*