Exemplo n.º 1
0
        /// <summary>
        /// IOCP完成操作时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void readArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            switch (e.LastOperation)
            {
            case SocketAsyncOperation.Receive:
                if (e.SocketError == SocketError.Success)
                {
                    if (e.BytesTransferred <= 0)
                    {
                        Close(DisconnectType.NetError);
                        return;
                    }
                    byte[] newData = new byte[e.BytesTransferred];
                    Array.Copy(e.Buffer, e.Offset, newData, 0, e.BytesTransferred);
                    try
                    {
                        dataPacketManager.ReceivedData(newData);
                    }
                    catch (Exception ex)
                    {
                        OnRaiseErrored(new RaiseErrorEvent()
                        {
                            ErrorMessage = ex.Message
                        });
                    }
                    BeginReceive(e);
                }
                else
                {
                    Close(DisconnectType.Disconnect);
                }
                break;

            case SocketAsyncOperation.Send:
                if (e.SocketError != SocketError.Success)
                {
                    sendQueue.Enqueue(e.Buffer);
                    //e.Buffer;
                    Close(DisconnectType.NetError);
                }
                else
                {
                    StartSend();
                }
                break;

            default:
                OnRaiseErrored(new RaiseErrorEvent()
                {
                    ErrorMessage = "读写错误"
                }); break;
            }
        }