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