Пример #1
0
        public virtual IMessage Decode(byte[] bytes)
        {
            header.Clear();
            header.Decode(bytes, 0);

            switch (header.GetMessageType())
            {
            case MessageType.Keyboard:
                keyboard.Clear();
                keyboard.Decode(bytes, 0);
                return(keyboard);

            case MessageType.Rocker:
                rocker.Clear();
                rocker.Decode(bytes, 0);
                return(rocker);

            case MessageType.Gyro:
                gyro.Clear();
                gyro.Decode(bytes, 0);
                return(gyro);
            }

            return(null);
        }
Пример #2
0
    /// <summary>
    /// 内部解析
    /// </summary>
    private void OnKcpRead(KChannel channel, byte[] bytes)
    {
        //处理连接
        if (!this.IsConnected)
        {
            //兼容1.3.1旧版本时,改用SimulationRecvConnected
            //OnConnectedSuccess();
        }
        else
        {
            //解析数据
            header.Clear();
            header.Decode(bytes, 0);

            if (header.GetMessageType() != MessageType.Msg)
            {
                int ts = (SystemTime.LowClientNow() - header.TimeStamp) / 2;

                Log.Debug("当前延迟:" + ts);

                if (ts < 0)
                {
                    ts = 10;
                }

                timeStampList.Add((uint)ts);
            }

            OnReadEventHandler?.Invoke(bytes);
        }
    }
Пример #3
0
        /// <summary>
        /// Handles incoming network traffic on this (Master,Agent) connection.
        /// Initially keeps going until we have a complete message header. When it has a complete
        /// header it determines the message length and keeps going until it has the entire message.
        /// Once it has a complete message it calls passes it to the Rate Controller for parsing.
        /// </summary>
        /// <param name="ar"></param>
        public void receiveComplete(IAsyncResult ar)
        {
            int bytesIn = 0;
            int offset  = 0;

            try
            {
                lock (LockReceive)
                {
                    Debug.Assert(Interlocked.Decrement(ref DbgBeginReceivePending) == 0);
                    CallbackContext callbackContext = (CallbackContext)ar.AsyncState;
                    Socket          socket          = callbackContext.socket;
                    bytesIn       = socket.EndReceive(ar);
                    offset        = callbackContext.offset;
                    bytesReceived = offset + bytesIn;
                    currOffset   += bytesIn;
                    if (bytesReceived == 0)
                    {
                        callbacks.ReceiveClose(this);
                    }
                    else if (bytesReceived < Message.SIZEOF_MESSAGE_HEADER)
                    {
                        // At outset must get enough bytes to extract message size from header.
                        int bytesNeeded = Message.SIZEOF_MESSAGE_HEADER - bytesReceived;
                        BeginReceive(receiveBuffer, currOffset, bytesExpected, receiveComplete);
                    }
                    else if (bytesReceived == Message.SIZEOF_MESSAGE_HEADER)
                    {
                        // We now have a complete message header and can determine message size.
                        messageHeader.InitFromNetBytes(receiveBuffer, 0);
                        int msgLen = messageHeader.GetLength();
                        bytesExpected += msgLen;
                        if (msgLen == 0 || bytesReceived == bytesExpected)
                        {
                            // The message has a zero-length body.
                            callbacks.ReceiveMessage(this, messageHeader.GetMessageType(), receiveBuffer, 0, bytesReceived);
                        }
                        else if (bytesReceived < bytesExpected)
                        {
                            int bytesNeeded = bytesExpected - bytesReceived;
                            BeginReceive(receiveBuffer, bytesReceived, bytesNeeded, receiveComplete);
                        }
                        else
                        {
                            // Should never get here.
                            throw new ApplicationException("Conn: received too many bytes (a).");
                        }
                    }
                    else if (bytesReceived < bytesExpected)
                    {
                        // Received an incomplete message and must obtain the missing (trailing) bytes.
                        int bytesNeeded = bytesExpected - bytesReceived;
                        BeginReceive(receiveBuffer, bytesReceived, bytesNeeded, receiveComplete);
                    }
                    else if (bytesReceived == bytesExpected)
                    {
                        // We have a complete message. Hand it to the Rate Controller for parsing.
                        callbacks.ReceiveMessage(this, messageHeader.GetMessageType(), receiveBuffer, 0, bytesReceived);
                    }
                    else
                    {
                        // Should never get here.
                        throw new ApplicationException("Conn: received too many bytes (b).");
                    }
                }
            }
            catch (SocketException sockEx)
            {
                callbacks.CatchSocketException(this, sockEx);
            }
            catch (ObjectDisposedException odex)
            {
                Console.WriteLine("receiveComplete caught ObjectDisposedException {0}", odex.Message);
            }
        }