Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
        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 { }
        }