/* */ #include "DHTNode.h" #include #include "util.h" #include "a2functional.h" #include "bittorrent_helper.h" #include "wallclock.h" 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); } DHTNode::~DHTNode() {} void DHTNode::generateID() { util::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_.difference(global::wallclock) >= DHT_NODE_CONTACT_INTERVAL; } void DHTNode::markGood() { condition_ = 0; } void DHTNode::markBad() { condition_ = BAD_CONDITION; } void DHTNode::updateLastContact() { lastContact_ = global::wallclock; } void DHTNode::timeout() { ++condition_; } std::string DHTNode::toString() const { return strconcat("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); } void DHTNode::setIPAddress(const std::string& ipaddr) { ipaddr_ = ipaddr; } } // namespace aria2