private void ProcessReceivePacket(RpcTcpPacket packet) { _counter.ReceiveMessagePerSec.Increment(); _counter.ReceiveMessageTotal.Increment(); if (packet.Direction == RpcMessageDirection.Request) { ThreadPool.QueueUserWorkItem( new WaitCallback(delegate(object state) { try { RpcTcpMessage <RpcRequest> request = packet.GetRequest(); RequestReceived(this, request.Sequence, request.Message); } catch (Exception ex) { _tracing.Error(ex, "ProcessRequest Failed"); _tracing.ErrorFmt("Packet: {0}", packet.DumpInfo()); } }) ); } else { ThreadPool.QueueUserWorkItem( new WaitCallback(delegate(object state) { try { RpcTcpMessage <RpcResponse> response = packet.GetResponse(); ResponseReceived(this, response.Sequence, response.Message); } catch (Exception ex) { _tracing.Error(ex, "ProcessResponse Failed"); _tracing.ErrorFmt("Packet: {0}", packet.DumpInfo()); } }) ); } }
private bool TryWriteBuffer(IRpcTcpSendingPacket packet, Stream stream, int remain) { int bodySize = 0; if (packet.BodyBuffer != null) { bodySize = packet.BodyBuffer.GetSize(); } if (bodySize + MaxHeaderSize > remain) { _tracing.InfoFmt("Write Packet Not Enough {0} < {1}", bodySize, remain); return(false); } else { long begin = stream.Position; RpcTcpPacket.WriteMessage(stream, packet); _tracing.InfoFmt("Write Packet OK {0} remain {1}", stream.Position - begin, remain); return(true); } }
private void ProcessReceive(SocketAsyncEventArgs e) { /* * 接收策略: * 总是尝试收满一个缓冲区, * 如果到N个字节, 先尝试填充一个Packet, * 分为两步, 填充头和填充体 * * 上一个没收完的Packet会放在e.UserToken中 * */ byte[] buffer = null; int offset = 0; int count = 0; RpcTcpPacket packet = null; try { if (e.BytesTransferred == 0) { Disconnect(); } else if (e.SocketError != SocketError.Success) { Disconnect(e.SocketError); } else { _counter.ReceivePerSec.Increment(); _counter.ReceiveTotal.Increment(); _counter.ReceiveBytesPerSec.IncrementBy(e.BytesTransferred); _counter.ReceiveBytesTotal.IncrementBy(e.BytesTransferred); _tracing.InfoFmt("Socket Receive {0} Bytes", e.BytesTransferred); packet = (RpcTcpPacket)e.UserToken; buffer = e.Buffer; offset = e.Offset; count = e.BytesTransferred; while (count > 0) { // 从头接收一个包 if (packet == null) { if (count >= RpcTcpPacket.IdentityLength) { //_tracing.InfoFmt("Receive Header {0} {1}", offset, RpcTcpPacket.IdentityLength); packet = new RpcTcpPacket(buffer, offset, RpcTcpPacket.IdentityLength); offset += RpcTcpPacket.IdentityLength; count -= RpcTcpPacket.IdentityLength; } else { // 缓冲区耗尽, 跳出 //_tracing.InfoFmt("Receive Header Empty {0} {1}", offset, count); packet = new RpcTcpPacket(buffer, offset, count); break; } } // 如果上一个包没收完, 则先接受完包头 int identityNeed = packet.IdentityNeed; if (identityNeed > 0) { if (count >= identityNeed) { packet.FillIdentity(buffer, offset, identityNeed); offset += identityNeed; count -= identityNeed; } else { // 缓冲区耗尽, 跳出 packet.FillIdentity(buffer, offset, count); break; } } // 继续读包体 int nextRecvSize = packet.NextRecvSize; if (count >= nextRecvSize) { packet.FillNext(buffer, offset, nextRecvSize); offset += nextRecvSize; count -= nextRecvSize; ProcessReceivePacket(packet); packet = null; // 置空,读下一个包 } else { // 缓冲区耗尽,跳出 packet.FillNext(buffer, offset, count); break; } } // // 将未接受完的包放到上下文中, 继续接收下一个 e.UserToken = packet; BeginReceive(); } } catch (Exception ex) { if (buffer != null) { StringBuilder str = new StringBuilder(); for (int i = offset; i < count; i++) { str.AppendFormat("{0:X2}", buffer[offset + i]); if ((i - offset) % 100 == 0) { str.Append("\r\n"); } } _tracing.ErrorFmt("ProcessReceive buffer parse failed!:\r\n{0}\r\n with {1}", str.ToString(), packet == null ? "" : packet.DumpInfo()); } Disconnect(ex, "ProcessReceive"); } }