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);
 }