private DhtRpcPacket Query(DhtRpcPacket query, NodeContact contact) { if (_currentNode.NodeEP.AddressFamily != contact.NodeEP.AddressFamily) { return(null); } Stream s = null; try { s = _manager.GetConnectionStream(contact.NodeEP); //set timeout s.WriteTimeout = QUERY_TIMEOUT; s.ReadTimeout = QUERY_TIMEOUT; //send query query.WriteTo(s); s.Flush(); //read response DhtRpcPacket response = new DhtRpcPacket(s); //auto add contact or update last seen time { NodeContact bucketContact = _routingTable.FindContact(contact.NodeID); if (bucketContact == null) { contact.UpdateLastSeenTime(); _routingTable.AddContact(contact); } else { bucketContact.UpdateLastSeenTime(); } } return(response); } catch { contact.IncrementRpcFailCount(); return(null); } finally { if (s != null) { s.Dispose(); } } }
internal bool Ping(NodeContact contact) { DhtRpcPacket response = Query(DhtRpcPacket.CreatePingPacketQuery(_currentNode), contact); if (response == null) { return(false); } else { if (contact.Equals(response.SourceNode)) { return(true); } else { contact.IncrementRpcFailCount(); return(false); } } }
private DhtRpcPacket Query(DhtRpcPacket packet, NodeContact contact) { Transaction transaction = new Transaction(contact.NodeID, contact.NodeEP); try { lock (_transactions) { _transactions.Add(packet.TransactionID, transaction); } lock (transaction) { lock (_sendBufferStream) { _sendBufferStream.Position = 0; packet.WriteTo(_sendBufferStream); if (_proxyEnabled) { _manager.SendDhtPacket(contact.NodeEP, _sendBufferStream.Buffer, 0, (int)_sendBufferStream.Position); } else { _udpClient.SendTo(_sendBufferStream.Buffer, 0, (int)_sendBufferStream.Position, SocketFlags.None, contact.NodeEP); } } if (!Monitor.Wait(transaction, QUERY_TIMEOUT)) { contact.IncrementRpcFailCount(); return(null); } //auto add contact or update last seen time if (contact.NodeID == null) { contact = transaction.ResponsePacket.SourceNode; } KBucket closestBucket = _routingTable.FindClosestBucket(contact.NodeID); NodeContact bucketContact = closestBucket.FindContactInCurrentBucket(contact.NodeID); if (bucketContact == null) { closestBucket.AddContactInCurrentBucket(contact); } else { bucketContact.UpdateLastSeenTime(); } return(transaction.ResponsePacket); } } finally { lock (_transactions) { _transactions.Remove(packet.TransactionID); } } }