private void ProcessReceive(SocketAsyncEventArgs e) { if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { AsyncUserToken userToken = e.UserToken as AsyncUserToken; ProcessReceiveData(userToken.DataStartOffset, userToken.NextReceiveOffset - userToken.DataStartOffset + e.BytesTransferred, 0, userToken, e); userToken.NextReceiveOffset += e.BytesTransferred; //如果达到缓冲区的结尾,则将NextReceiveOffset复位到缓冲区起始位置,并迁移可能需要迁移的未处理的数据 if (userToken.NextReceiveOffset == e.Buffer.Length) { //将NextReceiveOffset复位到缓冲区起始位置 userToken.NextReceiveOffset = 0; //如果还有未处理的数据,则把这些数据迁移到数据缓冲区的起始位置 if (userToken.DataStartOffset < e.Buffer.Length) { var notYesProcessDataSize = e.Buffer.Length - userToken.DataStartOffset; Buffer.BlockCopy(e.Buffer, userToken.DataStartOffset, e.Buffer, 0, notYesProcessDataSize); //数据迁移到缓冲区起始位置后,需要再次更新NextReceiveOffset userToken.NextReceiveOffset = notYesProcessDataSize; } userToken.DataStartOffset = 0; } //更新接收数据的缓冲区下次接收数据的起始位置和最大可接收数据的长度 e.SetBuffer(userToken.NextReceiveOffset, e.Buffer.Length - userToken.NextReceiveOffset); if (!userToken.ClientSocket.ReceiveAsync(e)) { ProcessReceive(e); } } else { _clientSocket.Close(); } }
private void ProcessReceiveData(int dataStartOffset, int totalReceivedSize, int alreadyProcessDataSize, AsyncUserToken userToken, SocketAsyncEventArgs e) { if (alreadyProcessDataSize >= totalReceivedSize) { return; } if (userToken.MessageSize == null) { if (totalReceivedSize > MessageHeaderSize) { var headerData = new byte[MessageHeaderSize]; Buffer.BlockCopy(e.Buffer, dataStartOffset, headerData, 0, MessageHeaderSize); var messageSize = BitConverter.ToInt32(headerData, 0); userToken.MessageSize = messageSize; userToken.DataStartOffset = dataStartOffset + MessageHeaderSize; ProcessReceiveData(userToken.DataStartOffset, totalReceivedSize, alreadyProcessDataSize + MessageHeaderSize, userToken, e); } } else { var messageSize = userToken.MessageSize.Value; if (totalReceivedSize - alreadyProcessDataSize >= messageSize) { var messageData = new byte[messageSize]; Buffer.BlockCopy(e.Buffer, dataStartOffset, messageData, 0, messageSize); ProcessMessage(messageData); userToken.MessageSize = null; userToken.DataStartOffset = dataStartOffset + messageSize; ProcessReceiveData(userToken.DataStartOffset, totalReceivedSize, alreadyProcessDataSize + messageSize, userToken, e); } } }