private void OnReceiveHeader(IAsyncResult ar) { bool succ = false; string err = string.Empty; if (ar.IsCompleted) { try { int recvBytes = _tcpClient.EndReceive(ar); if (!IsConnected) { return; // remote call close } System.Diagnostics.Debug.Assert(recvBytes == HeaderBytesLength); // parse header buffer // get message type string t = System.Text.ASCIIEncoding.ASCII.GetString(_inbound_header, 0, 4); _inbound_msg_type = (MsgType)Convert.ToInt32(t.Trim(), 16); // get payload size string size = System.Text.ASCIIEncoding.ASCII.GetString(_inbound_header, 4, 8); int data_size = Convert.ToInt32(size.Trim(), 16); // create buffer for receive payload data _inbound_data = new byte[data_size]; succ = true; } catch (SocketException socketEx) { err = string.Format("Socket Error: {0}", socketEx.Message); _status = Status.Fault; } catch (System.Exception ex) { err = string.Format("Encouter error while receiving header due to {0}", ex.Message); } } if (succ) { _tcpClient.BeginReceive(_inbound_data, 0, _inbound_data.Length, SocketFlags.None, new AsyncCallback(OnReceiveDataBody), ar.AsyncState); } else { ReceiveDoneCallback callback = ar.AsyncState as ReceiveDoneCallback; if (callback != null) { callback(succ, err, MsgType.UNKNOWN, new byte[0]); } } }
private void OnReceiveDataBody(IAsyncResult ar) { bool succ = false; string err = string.Empty; ReceiveDoneCallback callback = ar.AsyncState as ReceiveDoneCallback; if (ar.IsCompleted) { try { int recvBytes = _tcpClient.EndReceive(ar); if (!IsConnected) { return; // remote call close } System.Diagnostics.Debug.Assert(recvBytes == _inbound_data.Length); succ = true; if (callback != null) { callback(succ, err, _inbound_msg_type, _inbound_data); } } catch (SocketException socketEx) { err = string.Format("Socket Error: {0}", socketEx.Message); _status = Status.Fault; } catch (System.Exception ex) { err = string.Format("Encouter error while receiving data payload due to {0}", ex.Message); } } if (!succ) { if (callback != null) { callback(succ, err, MsgType.UNKNOWN, new byte[0]); } } if (_isContinuousReading) { ReceiveAsync(callback); } }
private void OnReceiveDataBody(IAsyncResult ar) { bool succ = false; string err = string.Empty; ReceiveDoneCallback callback = ar.AsyncState as ReceiveDoneCallback; if (ar.IsCompleted) { try { int recvBytes = _tcpClient.EndReceive(ar); System.Diagnostics.Debug.Assert(recvBytes == _inbound_data.Length); succ = true; if (callback != null) { callback(succ, err, _inbound_msg_type, _inbound_data); } } catch (System.Exception ex) { LogManager.Logger.ErrorFormat("Encouter error while receiving data payload due to {0}", ex); err = ex.Message; } } if (!succ) { if (callback != null) { callback(succ, err, MsgType.UNKNOWN, new byte[0]); } } if (_isContinuousReading) { ReceiveAsync(callback); } }
public void ReceiveAsync(ReceiveDoneCallback callback) { _tcpClient.BeginReceive(_inbound_header, 0, HeaderBytesLength, SocketFlags.None, new AsyncCallback(OnReceiveHeader), callback); }