private bool ReceiveData() { var msg = new Byte[4096]; while (true) { if (m_FreeSocket) { return(true); } if ((m_Socket != null) && (m_Socket.Connected)) { try { var bytesRead = m_Socket.Receive(msg, 0, 4096, SocketFlags.None); if (bytesRead > 0) { //msgReceived += Encoding.UTF8.GetString(msg, 0, bytesRead); if (PTZLogger.Log.IsEnabled(LogLevel.Debug)) { PTZLogger.Log.Debug("Raw msg : {0}", BitConverter.ToString(msg, 0, bytesRead)); } if (true) { m_ClientCallback.CompletionMessage(); } } else { PTZLogger.Log.Info("{0},{1}, The client has disconnected. The socket will be closed.", m_Name, m_Host); break; } } catch (SocketException exception) { if (exception.ErrorCode != 10004)//ErrorCode 10004: A blocking operation was interrupted by a call to WSACancelBlockingCall. { PTZLogger.Log.Error(exception, "{0},{1}, Error 10004 when recieved data", m_Name, m_Host); } //else Nothing to do, it's just a socket close. return(m_FreeSocket); } catch (Exception ex) { PTZLogger.Log.Error(ex, "{0},{1}, Error when recieved data", m_Name, m_Host); //a socket error has occured return(m_FreeSocket); } //PTZLogger.Log.Debug("Residue after parsing : {0}", msgReceived); } } return(false); }
private bool ReceiveData() { var bufferByteArray = new Byte[MAX_BYTEARRAY_LENGTH]; var receivedByteArray = new Byte[MAX_RECEIVED_BYTEARRAY_LENGTH]; short lenByteArray = 0; while (true) { if (m_FreeSocket) { return(true); } if ((m_Socket != null) && (m_Socket.Connected)) { try { var bytesRead = m_Socket.Receive(receivedByteArray, 0, MAX_RECEIVED_BYTEARRAY_LENGTH, SocketFlags.None); if (bytesRead > 0) { //msgReceived += Encoding.UTF8.GetString(msg, 0, bytesRead); if (PTZLogger.Log.IsEnabled(LogLevel.Debug)) { PTZLogger.Log.Debug("ReceiveData {0},{1}, Raw msg : {2}", m_Name, m_Host, BitConverter.ToString(receivedByteArray, 0, bytesRead)); } // check length max and move received byte array in global byte array if (lenByteArray + bytesRead >= MAX_BYTEARRAY_LENGTH) { PTZLogger.Log.Error("ReceiveData {0},{1}, Buffer byteArray overflow (waiting buffer:{2}, bytesRead:{3}, total:{4}, max allowed:{5}) BUFFER CLEARED", m_Name, m_Host, lenByteArray, bytesRead, lenByteArray + bytesRead, MAX_BYTEARRAY_LENGTH); lenByteArray = 0; Array.Clear(receivedByteArray, 0, MAX_RECEIVED_BYTEARRAY_LENGTH); Array.Clear(bufferByteArray, 0, MAX_BYTEARRAY_LENGTH); continue; } Array.Copy(receivedByteArray, lenByteArray, bufferByteArray, 0, bytesRead); Array.Clear(receivedByteArray, 0, MAX_RECEIVED_BYTEARRAY_LENGTH); // search message begin short startPosition = 0; for (; startPosition < bytesRead - 1; startPosition++) { // found if (bufferByteArray[startPosition] == 0x00 && bufferByteArray[startPosition + 1] != 0x00) { break; } } // check startPosition if (startPosition > bytesRead - 2) { PTZLogger.Log.Debug("ReceiveData {0},{1}, startPos({2}) > bytesRead({3}) - 2", m_Name, m_Host, startPosition, bytesRead); continue; } // check remaining length contains the message short msgLen = bufferByteArray[startPosition + 1]; if (msgLen > bytesRead - startPosition) { PTZLogger.Log.Debug("ReceiveData {0},{1}, msgLen({2})> bytesRead({3}) - startPos({4})", m_Name, m_Host, msgLen, bytesRead, startPosition); continue; } // prepare the message for callback byte[] message = new byte[msgLen]; Array.Copy(bufferByteArray, startPosition, message, 0, msgLen); // delete message and dummy Array.Clear(bufferByteArray, 0, startPosition + msgLen); // callback m_ClientCallback.CompletionMessage(BitConverter.ToString(message, 0, msgLen)); } else { PTZLogger.Log.Info("ReceiveData {0},{1}, The client has disconnected. The socket will be closed.", m_Name, m_Host); break; } } catch (SocketException exception) { if (exception.ErrorCode != 10004)//ErrorCode 10004: A blocking operation was interrupted by a call to WSACancelBlockingCall. { PTZLogger.Log.Error(exception, "ReceiveData {0},{1}, Error 10004 when received data", m_Name, m_Host); } //else Nothing to do, it's just a socket close. return(m_FreeSocket); } catch (Exception ex) { PTZLogger.Log.Error(ex, "ReceiveData {0},{1}, Error when received data", m_Name, m_Host); //a socket error has occured return(m_FreeSocket); } //PTZLogger.Log.Debug("Residue after parsing : {0}", msgReceived); } } return(false); }