Example #1
0
        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());
                    }
                })
                    );
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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");
            }
        }