Example #1
0
 public ConnectToLocalOwnerTask(IPEndPoint remoteEP, PeerToPeerRoomData data, int holePunchRequestPort, CancellationToken token)
 {
     m_RemoteEP             = remoteEP;
     m_HolePunchRequestPort = holePunchRequestPort;
     m_OwnerId = data.ConnectionId;
     m_Cookie  = data.Cookie;
     m_Randam  = data.Randam;
     m_Token   = token;
 }
Example #2
0
        public static async Task <Connection> ConnectToRoom(DiscoveryRoom room, bool waitAllHandshake = true, CancellationToken token = default)
        {
            var remoteEP = new IPEndPoint(room.Address, room.Port);

            if (!PeerToPeerRoomData.TryUnpack(room.Data, room.Data.Length, out var data))
            {
                throw new Exception("unpack room info");
            }
            var impl = await new ConnectToLocalOwnerTask(remoteEP, data, room.DiscoveryPort, token).Run();

            return(await TryWaitAllHandshake(new Connection(impl), waitAllHandshake, token));
        }
Example #3
0
        public static bool TryUnpack(byte[] buf, int size, out PeerToPeerRoomData data)
        {
            if (size < 6)
            {
                data = default;
                return(false);
            }
            int  offset     = 0;
            int  id         = BinaryUtil.ReadInt(buf, ref offset);
            byte cookieSize = buf[offset++];

            byte[] cookie     = BinaryUtil.ReadBytes(buf, cookieSize, ref offset);
            byte   randamSize = buf[offset++];

            byte[] randam = BinaryUtil.ReadBytes(buf, randamSize, ref offset);
            data = new PeerToPeerRoomData(id, cookie, randam);
            return(true);
        }
Example #4
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);
        }