diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-10-11 15:05:50 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-10-11 15:05:50 +0000 |
commit | d02633af4e780c4b6f6d938c67d84d2c968adb79 (patch) | |
tree | 3379b9615e285346ad6b1f87639912e01ecd44c7 /source/net_common.c | |
parent | f8abe42a0d1a42653b39f6cf320d3fbdd1279bb3 (diff) |
Major redesign of GTV protocol: added support for persistent GTV connections,
bidirectional pinging, low traffic (`suspended') modes.
HTTP server is now gone (remote console logging is temporary gone too),
custom binary protocol is used for GTV connections now.
MVD client no longer serves other MVD clients, only regular spectators.
Changed FIFO buffers to be regular circular buffers, not BIP-buffers.
Removed `sv_http_*', `sv_console_auth' variables.
Added `sv_mvd_maxclients' variable, `addgtvhost', `delgtvhost' and
`listgtvhosts' commands.
Renamed `sv_mvd_max*' cvars for consistency.
Reset `sv_ghostime' default value back to 6, but changed semantics:
it now waits for any packet from client, not just `begin' packet.
Added `--disable-mvd-server' and `--disable-mvd-client' options to
configure script.
FS_Restart() no longer chokes on real files opened for reading.
Fixed client chat prompt length.
Stubbed out more debugging stuff from dedicated server builds.
Diffstat (limited to 'source/net_common.c')
-rw-r--r-- | source/net_common.c | 101 |
1 files changed, 63 insertions, 38 deletions
diff --git a/source/net_common.c b/source/net_common.c index c522d10..3d225d8 100644 --- a/source/net_common.c +++ b/source/net_common.c @@ -923,15 +923,67 @@ neterr_t NET_Connect( const netadr_t *peer, netstream_t *s ) { return NET_OK; } -neterr_t NET_Run( netstream_t *s ) { +neterr_t NET_RunConnect( netstream_t *s ) { struct timeval tv; - fd_set rfd, wfd, efd; + fd_set fd; + socklen_t len; int ret, err; - size_t length; + + if( s->state != NS_CONNECTING ) { + return NET_AGAIN; + } + + tv.tv_sec = 0; + tv.tv_usec = 0; + FD_ZERO( &fd ); + FD_SET( s->socket, &fd ); + + ret = select( s->socket + 1, NULL, +#ifdef _WIN32 + NULL, &fd, +#else + &fd, NULL, +#endif + &tv ); + if( ret == -1 ) { + goto error1; + } + if( !ret ) { + return NET_AGAIN; + } + if( !FD_ISSET( s->socket, &fd ) ) { + return NET_AGAIN; + } + + len = sizeof( err ); + ret = getsockopt( s->socket, SOL_SOCKET, SO_ERROR, ( char * )&err, &len ); + if( ret == -1 ) { + goto error1; + } + if( err ) { + net_error = err; + goto error2; + } + + s->state = NS_CONNECTED; + return NET_OK; + +error1: + NET_GET_ERROR(); +error2: + s->state = NS_BROKEN; + return NET_ERROR; +} + +neterr_t NET_RunStream( netstream_t *s ) { + struct timeval tv; + fd_set rfd, wfd; + int ret; + size_t len; byte *data; neterr_t result = NET_AGAIN; - if( s->state < NS_CONNECTING || s->state > NS_CONNECTED ) { + if( s->state != NS_CONNECTED ) { return result; } @@ -941,9 +993,7 @@ neterr_t NET_Run( netstream_t *s ) { FD_SET( s->socket, &rfd ); FD_ZERO( &wfd ); FD_SET( s->socket, &wfd ); - FD_ZERO( &efd ); - FD_SET( s->socket, &efd ); - ret = select( s->socket + 1, &rfd, &wfd, &efd, &tv ); + ret = select( s->socket + 1, &rfd, &wfd, NULL, &tv ); if( ret == -1 ) { goto error; } @@ -952,36 +1002,11 @@ neterr_t NET_Run( netstream_t *s ) { return result; } - result = NET_AGAIN; - if( s->state == NS_CONNECTING ) { - socklen_t length; - - if( !FD_ISSET( s->socket, &wfd ) && !FD_ISSET( s->socket, &efd ) ) { - return result; - } - - length = sizeof( err ); - ret = getsockopt( s->socket, SOL_SOCKET, SO_ERROR, - ( char * )&err, &length ); - if( ret == -1 ) { - goto error; - } - - if( err ) { - net_error = err; - s->state = NS_BROKEN; - return NET_ERROR; - } - - s->state = NS_CONNECTED; - result = NET_OK; - } - if( FD_ISSET( s->socket, &rfd ) ) { // read as much as we can - data = FIFO_Reserve( &s->recv, &length ); - if( length ) { - ret = recv( s->socket, data, length, 0 ); + data = FIFO_Reserve( &s->recv, &len ); + if( len ) { + ret = recv( s->socket, data, len, 0 ); if( !ret ) { goto closed; } @@ -1002,9 +1027,9 @@ neterr_t NET_Run( netstream_t *s ) { if( FD_ISSET( s->socket, &wfd ) ) { // write as much as we can - data = FIFO_Peek( &s->send, &length ); - if( length ) { - ret = send( s->socket, data, length, 0 ); + data = FIFO_Peek( &s->send, &len ); + if( len ) { + ret = send( s->socket, data, len, 0 ); if( !ret ) { goto closed; } |