39using SocketCb = std::function<void(
const Sp<Node>&, net::RequestAnswer&&)>;
42 Socket(SocketCb&& on_receive) :
43 on_receive(std::move(on_receive)) {}
44 SocketCb on_receive {};
51 Node(
const InfoHash&
id,
const sockaddr* sa, socklen_t salen)
57 const SockAddr& getAddr()
const {
return addr; }
58 std::string getAddrStr()
const {
59 return addr.toString();
61 bool isClient()
const {
return is_client; }
62 bool isIncoming() {
return time > reply_time; }
64 const time_point& getTime()
const {
return time; }
65 const time_point& getReplyTime()
const {
return reply_time; }
66 void setTime(
const time_point& t) { time = t; }
74 if (++auth_errors > MAX_AUTH_ERRORS)
77 void authSuccess() { auth_errors = 0; }
79 bool isExpired()
const {
return expired_; }
80 bool isGood(time_point now)
const;
81 bool isPendingMessage()
const;
82 size_t getPendingMessageCount()
const;
84 bool isOld(
const time_point& now)
const {
85 return time + NODE_EXPIRE_TIME < now;
87 bool isRemovable(
const time_point& now)
const {
88 return isExpired() and isOld(now);
91 NodeExport exportNode()
const {
95 std::memcpy(&ne.ss, addr.
get(), ne.sslen);
98 sa_family_t getFamily()
const {
return addr.
getFamily(); }
100 void update(
const SockAddr&);
102 void requested(
const Sp<net::Request>& req);
103 void received(time_point now,
const Sp<net::Request>& req);
104 Sp<net::Request> getRequest(Tid tid);
105 void cancelRequest(
const Sp<net::Request>& req);
120 Sp<Socket> getSocket(Tid
id);
132 void reset() { expired_ =
false; reply_time = time_point::min(); }
141 return transaction_id ? ++transaction_id : transaction_id;
144 std::string toString()
const;
146 OPENDHT_PUBLIC
friend std::ostream& operator<< (std::ostream& s,
const Node& h);
148 static constexpr const std::chrono::minutes NODE_GOOD_TIME {120};
151 static constexpr const std::chrono::minutes NODE_EXPIRE_TIME {10};
154 static constexpr const std::chrono::seconds MAX_RESPONSE_TIME {1};
158 static const constexpr unsigned MAX_AUTH_ERRORS {3};
161 bool is_client {
false};
162 time_point time {time_point::min()};
163 time_point reply_time {time_point::min()};
164 unsigned auth_errors {0};
165 bool expired_ {
false};
167 using TransactionDist = std::uniform_int_distribution<
decltype(transaction_id)>;
169 std::map<Tid, Sp<net::Request>> requests_ {};
170 std::map<Tid, Sp<Socket>> sockets_;
const sockaddr * get() const
socklen_t getLength() const
sa_family_t getFamily() const
Tid openSocket(SocketCb &&cb)