コード例 #1
0
        async Task <HandshakeResult> WaitHandshakeAccept()
        {
            while (true)
            {
                var receive = await m_Socket.ReceiveAsync();

                var buf  = receive.Buffer;
                int size = buf.Length;
                if (size == 0 || buf[0] != (byte)PeerToPeerAccept.Type)
                {
                    continue;
                }
                int          offset = 5;
                int          nonce  = BinaryUtil.ReadInt(buf, ref offset);
                EncryptorKey key    = default;
                key.Cookie       = m_Cookie;
                key.MajorVersion = Protocol.MajorVersion;
                key.MinorVersion = Protocol.MinorVersion;
                key.Nonce        = nonce;
                key.ConnectionId = m_SelfId;
                key.Random       = new ArraySegment <byte>(m_Randam);

                var encryptor = m_EncryptorGenerator.Generate(in key);

                if (!PeerToPeerAccept.TryUnpack(buf, size, encryptor, out var packet))
                {
                    throw new Exception("fail unpack HandshakeAccept");
                }
                m_RemoteEP = receive.RemoteEndPoint;
                return(new HandshakeResult(encryptor, packet.GetPeerToPeerList()));
            }
        }
コード例 #2
0
        public bool OnHandshakeAccept(byte[] buf, int size, out PeerEntry peer, IPEndPoint remoteEP)
        {
            if (size < 9)
            {
                peer = null;
                return(false);
            }
            int offset    = 5;
            int nonce     = BinaryUtil.ReadInt(buf, ref offset);
            var key       = new EncryptorKey(m_Request, m_Info.Randam, nonce);
            var encryptor = m_Connection.m_EncryptorGenerator.Generate(key);

            if (!PeerToPeerAccept.TryUnpack(buf, size, encryptor, out var packet))
            {
                peer = null;
                return(false);
            }

            peer = new PeerEntry(packet.ConnectionId, nonce, encryptor, remoteEP);
            return(true);
        }