private void OnClientSocketReceive(IAsyncResult ar) { if (ar != m_currentAsyncResult) { // We ignore calls for old sockets which we no longer use // See: http://rajputyh.blogspot.co.il/2010/04/solve-exception-message-iasyncresult.html return; } ConnectionState state = (ConnectionState)ar.AsyncState; if (!m_clientSocket.Connected) { return; } int numberOfBytesReceived = 0; try { numberOfBytesReceived = m_clientSocket.EndReceive(ar); } catch (ObjectDisposedException) { Log("[ReceiveCallback] EndReceive ObjectDisposedException"); return; } catch (SocketException ex) { Log("[ReceiveCallback] EndReceive SocketException: " + ex.Message); return; } if (numberOfBytesReceived == 0) { m_isConnected = false; } else { NBTConnectionReceiveBuffer buffer = state.ReceiveBuffer; buffer.SetNumberOfBytesReceived(numberOfBytesReceived); ProcessConnectionBuffer(state); try { m_currentAsyncResult = m_clientSocket.BeginReceive(buffer.Buffer, buffer.WriteOffset, buffer.AvailableLength, SocketFlags.None, new AsyncCallback(OnClientSocketReceive), state); } catch (ObjectDisposedException) { m_isConnected = false; Log("[ReceiveCallback] BeginReceive ObjectDisposedException"); } catch (SocketException ex) { m_isConnected = false; Log("[ReceiveCallback] BeginReceive SocketException: " + ex.Message); } } }
private void OnClientSocketReceive(object sender, SocketAsyncEventArgs ar) { ConnectionState state = (ConnectionState)ar.UserToken; if (!m_clientSocket.Connected) { return; } int numberOfBytesReceived = 0; try { numberOfBytesReceived = ar.BytesTransferred; } catch (ObjectDisposedException) { Log("[ReceiveCallback] EndReceive ObjectDisposedException"); return; } catch (SocketException ex) { Log("[ReceiveCallback] EndReceive SocketException: " + ex.Message); return; } if (numberOfBytesReceived == 0) { m_isConnected = false; } else { NBTConnectionReceiveBuffer buffer = state.ReceiveBuffer; buffer.SetNumberOfBytesReceived(numberOfBytesReceived); ProcessConnectionBuffer(state); try { SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.SetBuffer(buffer.Buffer, buffer.WriteOffset, buffer.AvailableLength); args.Completed += OnClientSocketReceive; args.UserToken = state; if (!m_clientSocket.ReceiveAsync(ar)) { OnClientSocketReceive(sender, ar); } } catch (ObjectDisposedException) { m_isConnected = false; Log("[ReceiveCallback] BeginReceive ObjectDisposedException"); } catch (SocketException ex) { m_isConnected = false; Log("[ReceiveCallback] BeginReceive SocketException: " + ex.Message); } } }
private void OnClientSocketReceive(IAsyncResult ar) { ConnectionState state = (ConnectionState)ar.AsyncState; Socket clientSocket = state.ClientSocket; if (!clientSocket.Connected) { return; } int numberOfBytesReceived = 0; try { numberOfBytesReceived = clientSocket.EndReceive(ar); } catch (ArgumentException) // The IAsyncResult object was not returned from the corresponding synchronous method on this class. { return; } catch (ObjectDisposedException) { Log("[ReceiveCallback] EndReceive ObjectDisposedException"); return; } catch (SocketException ex) { Log("[ReceiveCallback] EndReceive SocketException: " + ex.Message); return; } if (numberOfBytesReceived == 0) { m_isConnected = false; } else { NBTConnectionReceiveBuffer buffer = state.ReceiveBuffer; buffer.SetNumberOfBytesReceived(numberOfBytesReceived); ProcessConnectionBuffer(state); try { clientSocket.BeginReceive(buffer.Buffer, buffer.WriteOffset, buffer.AvailableLength, SocketFlags.None, new AsyncCallback(OnClientSocketReceive), state); } catch (ObjectDisposedException) { m_isConnected = false; Log("[ReceiveCallback] BeginReceive ObjectDisposedException"); } catch (SocketException ex) { m_isConnected = false; Log("[ReceiveCallback] BeginReceive SocketException: " + ex.Message); } } }
private void ReceiveCallback(IAsyncResult result) { ConnectionState state = (ConnectionState)result.AsyncState; Socket clientSocket = state.ClientSocket; if (!m_listening) { clientSocket.Close(); return; } int numberOfBytesReceived; try { numberOfBytesReceived = clientSocket.EndReceive(result); } catch (ObjectDisposedException) { m_connectionManager.ReleaseConnection(state); return; } catch (SocketException) { m_connectionManager.ReleaseConnection(state); return; } if (numberOfBytesReceived == 0) { // The other side has closed the connection state.LogToServer(Severity.Debug, "The other side closed the connection"); m_connectionManager.ReleaseConnection(state); return; } NBTConnectionReceiveBuffer receiveBuffer = state.ReceiveBuffer; receiveBuffer.SetNumberOfBytesReceived(numberOfBytesReceived); ProcessConnectionBuffer(ref state); if (clientSocket.Connected) { try { clientSocket.BeginReceive(state.ReceiveBuffer.Buffer, state.ReceiveBuffer.WriteOffset, state.ReceiveBuffer.AvailableLength, 0, ReceiveCallback, state); } catch (ObjectDisposedException) { m_connectionManager.ReleaseConnection(state); } catch (SocketException) { m_connectionManager.ReleaseConnection(state); } } }
private void ReceiveCallback(IAsyncResult result) { ConnectionState state = (ConnectionState)result.AsyncState; Socket clientSocket = state.ClientSocket; if (!m_listening) { clientSocket.Close(); return; } int numberOfBytesReceived; try { numberOfBytesReceived = clientSocket.EndReceive(result); } catch (ObjectDisposedException) { state.LogToServer(Severity.Debug, "The connection was terminated"); m_connectionManager.ReleaseConnection(state); return; } catch (SocketException ex) { const int WSAECONNRESET = 10054; if (ex.ErrorCode == WSAECONNRESET) { state.LogToServer(Severity.Debug, "The connection was forcibly closed by the remote host"); } else { state.LogToServer(Severity.Debug, "The connection was terminated, Socket error code: {0}", ex.ErrorCode); } m_connectionManager.ReleaseConnection(state); return; } if (numberOfBytesReceived == 0) { state.LogToServer(Severity.Debug, "The client closed the connection"); m_connectionManager.ReleaseConnection(state); return; } state.UpdateLastReceiveDT(); NBTConnectionReceiveBuffer receiveBuffer = state.ReceiveBuffer; receiveBuffer.SetNumberOfBytesReceived(numberOfBytesReceived); ProcessConnectionBuffer(ref state); if (clientSocket.Connected) { try { clientSocket.BeginReceive(state.ReceiveBuffer.Buffer, state.ReceiveBuffer.WriteOffset, state.ReceiveBuffer.AvailableLength, 0, ReceiveCallback, state); } catch (ObjectDisposedException) { m_connectionManager.ReleaseConnection(state); } catch (SocketException) { m_connectionManager.ReleaseConnection(state); } } }
private void ReceiveCallback(object sender, SocketAsyncEventArgs result) { ConnectionState state = (ConnectionState)result.UserToken; Socket clientSocket = state.ClientSocket; if (!m_listening) { clientSocket.Dispose(); return; } int numberOfBytesReceived; try { numberOfBytesReceived = result.BytesTransferred; } catch (ObjectDisposedException) { state.LogToServer(Severity.Debug, "The connection was terminated"); m_connectionManager.ReleaseConnection(state); return; } catch (SocketException ex) { ///const int WSAECONNRESET = 10054; if (ex.SocketErrorCode == SocketError.ConnectionReset) { state.LogToServer(Severity.Debug, "The connection was forcibly closed by the remote host"); } else { state.LogToServer(Severity.Debug, "The connection was terminated, Socket error code: {0}", ex.SocketErrorCode); } m_connectionManager.ReleaseConnection(state); return; } if (numberOfBytesReceived == 0) { state.LogToServer(Severity.Debug, "The client closed the connection"); m_connectionManager.ReleaseConnection(state); return; } state.UpdateLastReceiveDT(); NBTConnectionReceiveBuffer receiveBuffer = state.ReceiveBuffer; receiveBuffer.SetNumberOfBytesReceived(numberOfBytesReceived); ProcessConnectionBuffer(ref state); if (clientSocket.Connected) { try { SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.SetBuffer(state.ReceiveBuffer.Buffer, state.ReceiveBuffer.WriteOffset, state.ReceiveBuffer.AvailableLength); args.Completed += ReceiveCallback; args.UserToken = state; //m_currentAsyncResult = if (!clientSocket.ReceiveAsync(args)) { ReceiveCallback(sender, args); } } catch (ObjectDisposedException) { m_connectionManager.ReleaseConnection(state); } catch (SocketException) { m_connectionManager.ReleaseConnection(state); } } }