Ejemplo n.º 1
0
        async void Receive(Func <string, bool> match)
        {
            while (m_Run)
            {
                try
                {
                    var res = await m_Socket.ReceiveAsync();

                    if (Discovery.TryUnpack(res.Buffer, res.Buffer.Length, out var packet))
                    {
                        var query = System.Text.Encoding.UTF8.GetString(packet.Query.Array, packet.Query.Offset, packet.Query.Count);
                        if (match(query))
                        {
                            lock (m_Socket)
                            {
                                m_Socket.Send(m_Response, 0, m_Response.Length, res.RemoteEndPoint);
                            }
                        }
                    }
                    else if (DiscoveryHolePunch.TryUnpack(res.Buffer, res.Buffer.Length, out _))
                    {
                        OnHolePunchRequest?.Invoke(res.RemoteEndPoint);
                    }
                }
                catch { }
            }
        }
Ejemplo n.º 2
0
 void Send(byte[] buf)
 {
     if (m_HolePunchRequestPort != 0)
     {
         var packet = new DiscoveryHolePunch().Pack();
         m_Socket.Broadcast(packet, 0, packet.Length, m_HolePunchRequestPort);
     }
     {
         m_Socket.Send(buf, 0, buf.Length, m_RemoteEP);
     }
     if (m_RemoteLocalEP != null)
     {
         m_Socket.Send(buf, 0, buf.Length, m_RemoteLocalEP);
     }
 }
Ejemplo n.º 3
0
        internal P2PConnectionImpl(LocalHostConfig config) : base(new UdpSocket(), new EncryptorGenerator())
        {
            m_IsOwner = true;
            m_CookieProvider.Update();
            m_Socket.Bind(new IPEndPoint(config.Address, 0), false);
            SelfId = Random.GenInt();
            P2PTask.CreateHostRandamKey();
            var randamKey = P2PTask.GetHostRandamKey();
            var data      = new PeerToPeerRoomData(SelfId, m_CookieProvider.Cookie, randamKey).Pack();

            m_DiscoveryService = new DiscoveryService(config.RoomName, m_Socket.LocalEP, data, config.DiscoveryServicePort);
            m_DiscoveryService.OnHolePunchRequest += (ep) =>
            {
                var packet = new DiscoveryHolePunch().Pack();
                m_Socket.Send(packet, 0, packet.Length, ep);
            };
            m_DiscoveryService.Start(config.DiscoveryQueryMatch);
        }
Ejemplo n.º 4
0
        public static bool TryUnpack(byte[] buf, int size, out DiscoveryHolePunch packet)
        {
            if (sizeof(byte) + Data.Length > size)
            {
                packet = default;
                return(false);
            }
            int offset = 1;

            for (var i = 0; i < Data.Length; i++)
            {
                if (Data[i] != buf[offset + i])
                {
                    packet = default;
                    return(false);
                }
            }
            packet = new DiscoveryHolePunch();
            return(true);
        }
Ejemplo n.º 5
0
        async Task <PeerToPeerHello> WaitHello()
        {
            while (true)
            {
                var receive = await m_Socket.ReceiveAsync();

                var buf  = receive.Buffer;
                int size = buf.Length;
                if (DiscoveryHolePunch.TryUnpack(buf, size, out var _))
                {
                    continue;
                }
                if (PeerToPeerHello.TryUnpack(buf, size, out var packet))
                {
                    m_RemoteEP      = receive.RemoteEndPoint;
                    m_RemoteLocalEP = null;
                    return(packet);
                }
                throw new Exception("fail PeerToPeerHello");
            }
        }