/* */ #include "DHTNode.h" #include "DHTUtil.h" #include "Util.h" #include namespace aria2 { DHTNode::DHTNode():_port(0), _rtt(0), _condition(0), _lastContact(0) { generateID(); } DHTNode::DHTNode(const unsigned char* id):_port(0), _rtt(0), _condition(1), _lastContact(0) { memcpy(_id, id, DHT_ID_LENGTH); } void DHTNode::generateID() { DHTUtil::generateRandomKey(_id); } bool DHTNode::operator==(const DHTNode& node) const { return memcmp(_id, node._id, DHT_ID_LENGTH) == 0; } bool DHTNode::operator<(const DHTNode& node) const { for(size_t i = 0; i < DHT_ID_LENGTH; ++i) { if(_id[i] > node._id[i]) { return false; } else if(_id[i] < node._id[i]) { return true; } } return true; } bool DHTNode::isGood() const { return !isBad() && !isQuestionable(); } #define BAD_CONDITION 5 bool DHTNode::isBad() const { return _condition >= BAD_CONDITION; } bool DHTNode::isQuestionable() const { return !isBad() && _lastContact.elapsed(DHT_NODE_CONTACT_INTERVAL); } void DHTNode::markGood() { _condition = 0; } void DHTNode::markBad() { _condition = BAD_CONDITION; } void DHTNode::updateLastContact() { _lastContact.reset(); } void DHTNode::timeout() { ++_condition; } std::string DHTNode::toString() const { return "DHTNode ID="+Util::toHex(_id, DHT_ID_LENGTH)+ ", Host="+_ipaddr+":"+Util::uitos(_port)+ ", Condition="+Util::uitos(_condition)+ ", RTT="+Util::uitos(_rtt); } void DHTNode::setID(const unsigned char* id) { memcpy(_id, id, DHT_ID_LENGTH); } } // namespace aria2