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; }
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)); }
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); }
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); }