Esempio n. 1
0
        private DhtRpcPacket ProcessQuery(DhtRpcPacket query, IPAddress remoteNodeIP)
        {
            AddNode(new IPEndPoint(remoteNodeIP, query.SourceNodePort));

            switch (query.Type)
            {
            case DhtRpcType.PING:
                return(DhtRpcPacket.CreatePingPacket(_currentNode));

            case DhtRpcType.FIND_NODE:
                return(DhtRpcPacket.CreateFindNodePacketResponse(_currentNode, query.NetworkID, _routingTable.GetKClosestContacts(query.NetworkID)));

            case DhtRpcType.FIND_PEERS:
                PeerEndPoint[] peers = _currentNode.GetPeers(query.NetworkID);
                if (peers.Length == 0)
                {
                    return(DhtRpcPacket.CreateFindPeersPacketResponse(_currentNode, query.NetworkID, _routingTable.GetKClosestContacts(query.NetworkID), peers));
                }
                else
                {
                    return(DhtRpcPacket.CreateFindPeersPacketResponse(_currentNode, query.NetworkID, new NodeContact[] { }, peers));
                }

            case DhtRpcType.ANNOUNCE_PEER:
                _currentNode.StorePeer(query.NetworkID, new PeerEndPoint(remoteNodeIP, query.ServicePort));
                return(DhtRpcPacket.CreateAnnouncePeerPacketResponse(_currentNode, query.NetworkID, _currentNode.GetPeers(query.NetworkID)));

            default:
                throw new Exception("Invalid DHT-RPC type.");
            }
        }
Esempio n. 2
0
 public void AddNode(NodeContact contact)
 {
     if (!NetUtilities.IsPrivateIP(contact.NodeEP.Address) && (contact.NodeEP.AddressFamily == _currentNode.NodeEP.AddressFamily))
     {
         if (_routingTable.AddContact(contact))
         {
             ThreadPool.QueueUserWorkItem(delegate(object state)
             {
                 Query(DhtRpcPacket.CreatePingPacket(_currentNode), contact);
             });
         }
     }
 }
Esempio n. 3
0
        internal bool Ping(NodeContact contact)
        {
            DhtRpcPacket response = Query(DhtRpcPacket.CreatePingPacket(_currentNode), contact);

            return(response != null);
        }