Пример #1
0
        // 接收数据主要是通过ReceiveHeader和ReceiveBody两个函数。
        void ReceiveHeader(IAsyncResult ar)
        {
            try
            {
                // 返回网络上接收的数据长度
                int read = socket.EndReceive(ar);
                // 已断开连接
                if (read < 1)
                {
                    // 通知丢失连接
                    handler.OnLost(rPacket);
                    return;
                }

                rPacket.readLength += read;
                // 消息头必须读满4个字节
                if (rPacket.readLength < NetPacket.headerLength)
                {
                    socket.BeginReceive(rPacket.bytes,
                                        rPacket.readLength,                          // 存储偏移已读入的长度
                                        NetPacket.headerLength - rPacket.readLength, // 这次只读入剩余的数据
                                        SocketFlags.None,
                                        new AsyncCallback(ReceiveHeader),
                                        rPacket);
                }
                else
                {
                    // 获得消息体长度
                    rPacket.DecodeHeader();

                    rPacket.readLength = 0;
                    // 开始读取消息体
                    socket.BeginReceive(rPacket.bytes,
                                        NetPacket.headerLength,
                                        rPacket.bodyLenght,
                                        SocketFlags.None,
                                        new AsyncCallback(ReceiveBody),
                                        rPacket);
                }
            }
            catch (Exception ex)
            {
                handler.OnError("ReceiveHeader", ex);
            }
        }