40using SocketCb = std::function<void(
const Sp<Node>&, net::RequestAnswer&&)>;
53 Node(
const InfoHash&
id,
const sockaddr* sa, socklen_t salen, std::mt19937_64& rd)
59 const SockAddr& getAddr()
const {
return addr; }
60 std::string getAddrStr()
const {
61 return addr.toString();
63 bool isClient()
const {
return is_client; }
64 bool isIncoming() {
return time > reply_time; }
66 const time_point& getTime()
const {
return time; }
67 const time_point& getReplyTime()
const {
return reply_time; }
68 void setTime(
const time_point& t) { time = t; }
76 if (++auth_errors > MAX_AUTH_ERRORS)
79 void authSuccess() { auth_errors = 0; }
81 bool isExpired()
const {
return expired_; }
82 bool isGood(time_point now)
const;
83 bool isPendingMessage()
const;
84 size_t getPendingMessageCount()
const;
86 bool isOld(
const time_point& now)
const {
87 return time + NODE_EXPIRE_TIME < now;
89 bool isRemovable(
const time_point& now)
const {
90 return isExpired() and isOld(now);
93 NodeExport exportNode()
const {
99 sa_family_t getFamily()
const {
return addr.
getFamily(); }
101 void update(
const SockAddr&);
103 void requested(
const Sp<net::Request>& req);
104 void received(time_point now,
const Sp<net::Request>& req);
105 Sp<net::Request> getRequest(Tid tid);
106 void cancelRequest(
const Sp<net::Request>& req);
121 Sp<Socket> getSocket(Tid
id);
133 void reset() { expired_ =
false; reply_time = time_point::min(); }
142 return transaction_id ? transaction_id : ++transaction_id;
145 std::string toString()
const;
147 OPENDHT_PUBLIC
friend std::ostream& operator<< (std::ostream& s,
const Node& h);
149 static constexpr const std::chrono::minutes NODE_GOOD_TIME {120};
152 static constexpr const std::chrono::minutes NODE_EXPIRE_TIME {10};
155 static constexpr const std::chrono::seconds MAX_RESPONSE_TIME {1};
159 static const constexpr unsigned MAX_AUTH_ERRORS {3};
162 bool is_client {
false};
163 time_point time {time_point::min()};
164 time_point reply_time {time_point::min()};
165 unsigned auth_errors {0};
166 bool expired_ {
false};
168 using TransactionDist = std::uniform_int_distribution<
decltype(transaction_id)>;
170 std::map<Tid, Sp<net::Request>> requests_ {};
171 std::map<Tid, Sp<Socket>> sockets_;