public override void ProcessConnection() { IClient server = Server.GetSuperPeerClient(); IClient client = Client.GetSuperPeerClient(); server.Send(new RequestMessage(MessageType.TcpConnection)); PeerAddressMessage serverConnectionAddress = (PeerAddressMessage)server.Read(); client.Send(new RequestMessage(MessageType.TcpConnection)); client.Send(serverConnectionAddress); }
public override IClient GetConnection() { PeerAddressMessage peerAddressMessage = (PeerAddressMessage)ClientPeer.Peer.ReadFromSuperPeer(); MessageManager messageManager = ClientPeer.Peer.MessageManager; IPEndPoint connectionIpEndPoint = peerAddressMessage.PeerAddress.PrivateEndPoint; Client = new ClientTcp(connectionIpEndPoint, messageManager); return(Client); }
public void Connect(PeerAddress peerAddress) { var connectAsServerMessage = new PeerAddressMessage(peerAddress, MessageType.ConnectAsClient); Peer.SendToSuperPeer(connectAsServerMessage); Peer.ReadFromSuperPeer(); var connection = new TcpClientPeerConnection(this, Peer.PeerAddress); _server = connection.GetConnection(); Peer.Close(); }
public void AllowConnection(PeerAddress peerAddress) { var connectAsServerMessage = new PeerAddressMessage(peerAddress, MessageType.ConnectAsServer); Peer.SendToSuperPeer(connectAsServerMessage); Peer.ReadFromSuperPeer(); ServerPeerConnection serverPeerConnection = new TcpServerPeerConnection(this); _client = serverPeerConnection.GetConnection(); Peer.Close(); Console.WriteLine("Client connected to server"); }
private void ProcessUdpMessage(byte[] buffer, IPEndPoint remoteEndPoint) { try { InfoMessage infoMessage = InfoMessage.Parser.ParseFrom(buffer); Console.WriteLine($">>> Got bad UDP {remoteEndPoint.Address}:{remoteEndPoint.Port}"); _udpClient.Send(new byte[] { 1 }, 1, remoteEndPoint); return; } catch { } PeerAddressMessage peerAddressMessage = PeerAddressMessage.Parser.ParseFrom(buffer); Console.WriteLine($">>> Got UDP from {peerAddressMessage.Id}. {remoteEndPoint.Address}:{remoteEndPoint.Port}"); if (!_contexts.TryGetValue(peerAddressMessage.Id, out PeerContext context)) { context = new PeerContext { peerId = peerAddressMessage.Id, publicUdpEndPoint = peerAddressMessage.PublicEndpoint.Convert(), localUdpEndPoint = peerAddressMessage.LocalEndpoint.Convert(), }; _contexts.Add(context.peerId, context); } int partnerId = Mappings[context.peerId]; if (!_contexts.TryGetValue(partnerId, out context)) { _udpClient.Send(new byte[] { 1 }, 1, remoteEndPoint); return; } var response = new PeerAddressMessage { Id = partnerId, PublicEndpoint = context.publicUdpEndPoint.Convert(), LocalEndpoint = context.localUdpEndPoint.Convert() }; byte[] bytes = response.ToByteArray(); _udpClient.Send(bytes, bytes.Length, remoteEndPoint); Console.WriteLine($" <<< Responsed to {response.Id}"); }
public static bool TryParse(byte[] data, out PeerAddressMessage message) { message = null; if (!data.StartsWith(Prefix)) { return(false); } if (!data.StartsWith(MessagePrefix, Prefix.Length)) { return(false); } if (data.Length != MessageLength) { return(false); } int index = Prefix.Length + MessagePrefix.Length; byte id = data[index]; index += PeerIdLength; byte[] publicIpBytes = data.Take(index, IpLength); var publicIp = new IPAddress(publicIpBytes); index += IpLength; byte[] publicPortBytes = data.Take(index, IntLength); int publicPort = publicPortBytes.GetInt(); index += IntLength; byte[] localIpBytes = data.Take(index, IpLength); var localIp = new IPAddress(localIpBytes); index += IpLength; byte[] localPortBytes = data.Take(index, IntLength); int localPort = localPortBytes.GetInt(); message = new PeerAddressMessage(data, id, publicIp, publicPort, localIp, localPort); return(true); }
private static void ProcessServerUdpMessage(byte[] buffer, IPEndPoint remoteEndPoint) { try { PeerAddressMessage addressMessage = PeerAddressMessage.Parser.ParseFrom(buffer); // if server sends the partner's endpoints, we will store it and (IMPORTANT) close "puncher" Console.WriteLine(" <<< Got response from server"); _partnerPublicUdpEndPoint = addressMessage.PublicEndpoint.Convert(); _partnerLocalUdpEndPoint = addressMessage.LocalEndpoint.Convert(); _udpPuncher.Close(); return; } catch { } try { TryProcessKeepalive(buffer, remoteEndPoint); return; } catch { } }