Ejemplo n.º 1
0
        private void ProcessReceiveDatas()
        {
            this._receivedDatas.Switch();
            while (!this._receivedDatas.isEmpty)
            {
                ReceivedData receivedData = this._receivedDatas.Pop();
                byte[]       data         = receivedData.data;
                int          offset       = 0;
                int          size         = data.Length;

                if (!this.VerifyConnKey(data, ref offset, ref size))
                {
                    continue;
                }

                if (this.VerifyHandshake(data, ref offset, ref size))
                {
                    KCPUserToken newToken = this._tokenManager.Create();
                    this._rpcManager.OnUserTokenSpawn(newToken);
                    newToken.OnSpawn(this, receivedData.remoteEndPoint, TimeUtils.utcTime);
                    this.OnSocketEvent?.Invoke(new SocketEvent(SocketEvent.Type.Accept,
                                                               $"Client connection accepted, Remote Address: {receivedData.remoteEndPoint}",
                                                               SocketError.Success, newToken));

                    byte[] handshakeAckData   = new byte[NetworkConfig.SIZE_OF_CONN_KEY + NetworkConfig.SIZE_OF_SIGNATURE + NetworkConfig.SIZE_OF_PEER_ID];
                    int    handshakeAckOffset = ByteUtils.Encode32u(handshakeAckData, 0, NetworkConfig.CONN_KEY);
                    handshakeAckOffset += ByteUtils.Encode16u(handshakeAckData, handshakeAckOffset, NetworkConfig.HANDSHAKE_SIGNATURE);
                    handshakeAckOffset += ByteUtils.Encode16u(handshakeAckData, handshakeAckOffset, newToken.id);
                    newToken.SendDirect(handshakeAckData, 0, handshakeAckOffset);
                    continue;
                }

                ushort peerId = 0;
                if (!this.VerifyPeerId(data, ref offset, ref size, ref peerId))
                {
                    continue;
                }

                KCPUserToken token = this._tokenManager.Get(peerId);
                token?.ProcessData(data, offset, size, packet =>
                {
                    if (packet.module == NetworkConfig.INTERNAL_MODULE && packet.command == 0)
                    {
                        token.Send(new PacketHeartBeat((( PacketHeartBeat )packet).localTime));
                    }
                    else
                    {
                        this._rpcManager.Invoke(token, packet);
                        this.OnSocketEvent?.Invoke(new SocketEvent(SocketEvent.Type.Receive, packet, token));
                    }
                });
            }
        }