/// <summary> /// Callback for asynchronous receiving. /// </summary> /// <param name="ar">The socket state object for receiving data</param> protected static void ReadCallback(IAsyncResult ar) { SocketStateObject state = (SocketStateObject)ar.AsyncState; AbstractTcpSocketClientHandler handler = state.workHandler; try { // Read data from the client socket. int read = handler.EndReceive(ar); Trace.WriteLine(string.Format("Receive {0} bytes", read)); // Data was read from the client socket. if (read > 0) { // Fire event for incoming message handler.OnReceivingMessage(handler); while (true) { AbstractMessage message = AbstractMessage.TryReadMessage(handler.GetMessageInstance(), state, read); // Fire event for received message if (message != null) { ReceiveMessageStateObject rcvObj = new ReceiveMessageStateObject() { Handler = handler, Message = message }; handler.OnReceiveMessage(rcvObj); } if (state.pendingBuffer == null) { break; } read = 0; } handler.socket.BeginReceive(state, new AsyncCallback(ReadCallback)); } else { handler.Close(); } } catch (MessageException mex) { // Invalid message Trace.WriteLine(string.Format("Exception {0}. Connection will be closed", mex)); state.message = null; state.pendingBuffer = null; handler.Close(); } catch (SocketException sex) { if (sex.SocketErrorCode == SocketError.ConnectionReset || sex.SocketErrorCode == SocketError.ConnectionAborted) { Trace.WriteLine(string.Format("Socket error for disconnection {0} : {1} : {2}. Client will be disconnected", sex.ErrorCode, sex.SocketErrorCode, sex.Message)); state.message = null; state.pendingBuffer = null; handler.Close(); } else { Trace.WriteLine(string.Format("Exception {0}. Connection will be closed", sex)); state.message = null; state.pendingBuffer = null; handler.Close(); } } catch (Exception ex) { Trace.WriteLine(string.Format("Exception {0}. Connection will be closed", ex)); state.message = null; state.pendingBuffer = null; handler.Close(); } }