diff options
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; } |