private void ProcessSend(SocketAsyncEventArgs ioEventArgs) { DataToken dataToken = (DataToken)ioEventArgs.UserToken; if (ioEventArgs.SocketError == SocketError.Success) { dataToken.messageBytesDone += ioEventArgs.BytesTransferred; if (dataToken.messageBytesDone != dataToken.messageLength) { PostSend(ioEventArgs); } else { dataToken.ResultCallback(ResultCode.Success); dataToken.Reset(true); try { TryDequeueAndPostSend(dataToken.Socket, ioEventArgs); } catch { dataToken.Socket.ResetSendFlag(); throw; } } } else { dataToken.ResultCallback(ResultCode.Close); dataToken.Socket.ResetSendFlag(); Closing(ioEventArgs); } }
/// <summary> /// /// </summary> /// <param name="dataToken"></param> /// <param name="buffer"></param> /// <param name="messageList"></param> /// <returns></returns> public override bool TryReadMeaage(DataToken dataToken, byte[] buffer, out List <DataMessage> messageList) { messageList = new List <DataMessage>(); int remainingBytesToProcess = buffer.Length; bool needPostAnother = true; do { if (dataToken.prefixBytesDone < 4) { remainingBytesToProcess = HandlePrefix(buffer, dataToken.bufferSkip, dataToken, remainingBytesToProcess); if (dataToken.prefixBytesDone == 4 && (dataToken.messageLength > 10 * 1024 * 1024 || dataToken.messageLength <= 0)) { byte[] bufferBytes = dataToken.byteArrayForMessage == null? BufferUtils.MergeBytes(dataToken.byteArrayForPrefix, BufferUtils.GetBytes(buffer, dataToken.bufferSkip, buffer.Length - dataToken.bufferSkip)) : BufferUtils.MergeBytes(dataToken.byteArrayForPrefix, dataToken.byteArrayForMessage, buffer); string data = Encoding.UTF8.GetString(bufferBytes); //消息头已接收完毕,并且接收到的消息长度大于10M,socket传输的数据已紊乱,关闭掉 TraceLog.Write("The host[{0}] request parser head byte error, byte len={1}\r\ndata:{2}", dataToken.Socket.RemoteEndPoint.ToNotNullString(), dataToken.messageLength, data); needPostAnother = false; break; } //if (logger.IsDebugEnabled) logger.Debug("处理消息头,消息长度[{0}],剩余字节[{1}]", dataToken.messageLength, remainingBytesToProcess); if (remainingBytesToProcess == 0) { break; } } remainingBytesToProcess = HandleMessage(buffer, dataToken.bufferSkip, dataToken, remainingBytesToProcess); if (dataToken.IsMessageReady) { //if (logger.IsDebugEnabled) logger.Debug("完整封包 长度[{0}],总传输[{1}],剩余[{2}]", dataToken.messageLength, ioEventArgs.BytesTransferred, remainingBytesToProcess); messageList.Add(new DataMessage() { Data = dataToken.byteArrayForMessage, OpCode = OpCode.Binary }); if (remainingBytesToProcess != 0) { //if (logger.IsDebugEnabled) logger.Debug("重置缓冲区,buffskip指针[{0}]。", dataToken.bufferSkip); dataToken.Reset(false); } } else { //if (logger.IsDebugEnabled) logger.Debug("不完整封包 长度[{0}],总传输[{1}],已接收[{2}]", dataToken.messageLength, ioEventArgs.BytesTransferred, dataToken.messageBytesDone); } } while (remainingBytesToProcess != 0); if (needPostAnother) { //继续处理下个请求包 if (dataToken.prefixBytesDone == 4 && dataToken.IsMessageReady) { dataToken.Reset(true); } dataToken.bufferSkip = 0; } return(needPostAnother); }