// 接收数据主要是通过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); } }