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."); } }
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); }); } } }
internal bool Ping(NodeContact contact) { DhtRpcPacket response = Query(DhtRpcPacket.CreatePingPacket(_currentNode), contact); return(response != null); }