diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index 5527a1d3..ecfff43d 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -477,34 +477,34 @@ namespace Jack int JackNetDriver::Recv ( size_t size, int flags ) { - int rx_bytes; - if ( ( rx_bytes = fSocket.Recv ( fRxBuffer, size, flags ) ) == SOCKET_ERROR ) + int rx_bytes = fSocket.Recv ( fRxBuffer, size, flags ); + //handle errors + if ( rx_bytes == SOCKET_ERROR ) { net_error_t error = fSocket.GetError(); + //just tell there is no data and return 0 instead of SOCKET_ERROR if ( error == NET_NO_DATA ) { - jack_error ( "No incoming data, is the master still running ?" ); + jack_error ( "No data, is the master still running ?" ); return 0; } + //if a network error occurs, this exception will restart the driver else if ( error == NET_CONN_ERROR ) - { throw JackDriverException ( "Connection lost." ); - } else - { jack_error ( "Error in receive : %s", StrError ( NET_ERROR_CODE ) ); - return 0; - } } return rx_bytes; } int JackNetDriver::Send ( size_t size, int flags ) { - int tx_bytes; - if ( ( tx_bytes = fSocket.Send ( fTxBuffer, size, flags ) ) == SOCKET_ERROR ) + int tx_bytes = fSocket.Send ( fTxBuffer, size, flags ); + //handle errors + if ( tx_bytes == SOCKET_ERROR ) { net_error_t error = fSocket.GetError(); + //if a network error occurs, this exception will restart the driver if ( error == NET_CONN_ERROR ) throw JackDriverException ( "Connection lost." ); else @@ -534,8 +534,9 @@ namespace Jack do { rx_bytes = Recv ( fParams.fMtu, 0 ); - if ( ( rx_bytes == 0 ) || ( rx_bytes == SOCKET_ERROR ) ) - return rx_bytes; + //if error, don't return -1, we need the driver to restart and not to exit + if ( rx_bytes == SOCKET_ERROR ) + return 0; } while ( !rx_bytes && ( rx_head->fDataType != 's' ) ); @@ -547,8 +548,9 @@ namespace Jack { do { - if ( ( rx_bytes = Recv ( fParams.fMtu, MSG_PEEK ) ) == SOCKET_ERROR ) - return rx_bytes; + rx_bytes = Recv ( fParams.fMtu, MSG_PEEK ); + if ( rx_bytes == SOCKET_ERROR ) + return 0; if ( rx_bytes && ( rx_head->fDataStream == 's' ) && ( rx_head->fID == fParams.fID ) ) { switch ( rx_head->fDataType ) diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index 2bd0cdec..920e5ac8 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -122,7 +122,7 @@ namespace Jack //monitor #ifdef JACK_MONITOR - fPeriodUsecs = ( int ) ( 1000000.f * ( (float)fParams.fPeriodSize / (float)fParams.fSampleRate ) ); + fPeriodUsecs = ( int ) ( 1000000.f * ( ( float ) fParams.fPeriodSize / ( float ) fParams.fSampleRate ) ); string plot_name = string ( fParams.fName ); plot_name += string ( "_master" ); plot_name += string ( ( fParams.fSlaveSyncMode ) ? "_sync" : "_async" ); @@ -342,7 +342,6 @@ namespace Jack jack_error ( "'%s' : %s, please check network connection with '%s'.", fParams.fName, StrError ( NET_ERROR_CODE ), fParams.fSlaveNetName ); Exit(); - return 0; } else jack_error ( "Error in send : %s", StrError ( NET_ERROR_CODE ) ); @@ -358,21 +357,21 @@ namespace Jack net_error_t error = fSocket.GetError(); if ( error == NET_NO_DATA ) { - //too much receive failure, react... - if ( ++fNetJumpCnt == 50 ) + //too much receive failure, exit + if ( ++fNetJumpCnt == 100 ) { - jack_error ( "Connection lost, is %s still running ?", fParams.fName ); + jack_error ( "No data from %s...", fParams.fName ); fNetJumpCnt = 0; } + //we don't want the process to stop here, so just return 0 return 0; } else if ( error == NET_CONN_ERROR ) { //fatal connection issue, exit - jack_error ( "'%s' : %s, please check network connection with '%s'.", + jack_error ( "'%s' : %s, network connection with '%s' broken, exiting.", fParams.fName, StrError ( NET_ERROR_CODE ), fParams.fSlaveNetName ); Exit(); - return 0; } else jack_error ( "Error in receive : %s", StrError ( NET_ERROR_CODE ) ); @@ -451,7 +450,7 @@ namespace Jack memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); copy_size = fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize ); tx_bytes = Send ( fTxBuffer, sizeof ( packet_header_t ) + copy_size, 0 ); - if ( tx_bytes < 1 ) + if ( ( tx_bytes == 0 ) || ( tx_bytes == SOCKET_ERROR ) ) return tx_bytes; } } @@ -468,7 +467,7 @@ namespace Jack memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); fNetAudioCaptureBuffer->RenderFromJackPorts ( subproc ); tx_bytes = Send ( fTxBuffer, fAudioTxLen, 0 ); - if ( tx_bytes < 1 ) + if ( ( tx_bytes == 0 ) || ( tx_bytes == SOCKET_ERROR ) ) return tx_bytes; } }