diff --git a/include/opendht/dht.h b/include/opendht/dht.h index 1cccff2eb7a8e04a565b16c4f802de48f37a1126..7a1567bb33480ff8cba9a775c65d70a0ff511f83 100644 --- a/include/opendht/dht.h +++ b/include/opendht/dht.h @@ -339,6 +339,9 @@ public: std::string getSearchesLog(sa_family_t) const; void dumpTables() const; + std::vector<unsigned> getNodeMessageStats(bool in = false) const { + return {out.ping, out.find, out.get, out.listen, out.put}; + } /* This must be provided by the user. */ static bool isBlacklisted(const sockaddr*, socklen_t) { return false; } @@ -895,6 +898,17 @@ private: bool rateLimit(); bool neighbourhoodMaintenance(RoutingTable&); + + struct MessageStats { + unsigned ping {0}; + unsigned find {0}; + unsigned get {0}; + unsigned put {0}; + unsigned listen {0}; + }; + + MessageStats in {}, out {}; + }; } diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h index ce274cf18930f13a3c1870d31ac8b0a166ab3f9c..97a940d6b5549dd9a2291ae4aa562f333d44e232 100644 --- a/include/opendht/dhtrunner.h +++ b/include/opendht/dhtrunner.h @@ -256,6 +256,12 @@ public: return dht_->getNodesStats(af, good_return, dubious_return, cached_return, incoming_return); } + std::vector<unsigned> getNodeMessageStats(bool in = false) const + { + std::lock_guard<std::mutex> lck(dht_mtx); + return dht_->getNodeMessageStats(in); + } + std::string getStorageLog() const { std::lock_guard<std::mutex> lck(dht_mtx); diff --git a/python/opendht.pyx b/python/opendht.pyx index 158107e0a1791609d63911c9188e928caa8c2aa4..6824a2e2ce957e7bfbb11bb6d0e12c16b5928b5b 100644 --- a/python/opendht.pyx +++ b/python/opendht.pyx @@ -269,6 +269,12 @@ cdef class DhtRunner(_WithID): return self.thisptr.getRoutingTablesLog(af).decode() def getSearchesLog(self, cpp.sa_family_t af): return self.thisptr.getSearchesLog(af).decode() + def getNodeMessageStats(self): + stats = [] + cdef cpp.vector[unsigned] res = self.thisptr.getNodeMessageStats(False) + for n in res: + stats.append(n) + return stats def get(self, InfoHash key, get_cb=None, done_cb=None): """Retreive values associated with a key on the DHT. diff --git a/python/opendht_cpp.pxd b/python/opendht_cpp.pxd index 5ee950459833a96adc33b33d2d1a581c6a862ff0..36053cd41de18a64202f739650c5cab1c572958c 100644 --- a/python/opendht_cpp.pxd +++ b/python/opendht_cpp.pxd @@ -127,5 +127,6 @@ cdef extern from "opendht/dhtrunner.h" namespace "dht": void put(InfoHash key, shared_ptr[Value] val, Dht.DoneCallback done_cb) ListenToken listen(InfoHash key, Dht.GetCallback get_cb) void cancelListen(InfoHash key, SharedListenToken token) + vector[unsigned] getNodeMessageStats(bool i) ctypedef DhtRunner.Config Config diff --git a/src/dht.cpp b/src/dht.cpp index 34164bfe87f22459f280ed1596cf0e03de57e420..28f59f9d088bd2a9dd69016b065d8133129c8bc0 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -2739,6 +2739,8 @@ Dht::sendPing(const sockaddr *sa, socklen_t salen, TransId tid) pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.ping++; + return send(buffer.data(), buffer.size(), 0, sa, salen); } @@ -2785,6 +2787,8 @@ Dht::sendFindNode(const sockaddr *sa, socklen_t salen, TransId tid, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.find++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); } @@ -2966,6 +2970,8 @@ Dht::sendGetValues(const sockaddr *sa, socklen_t salen, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.get++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); } @@ -2988,6 +2994,8 @@ Dht::sendListen(const sockaddr* sa, socklen_t salen, TransId tid, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.listen++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); } @@ -3031,6 +3039,8 @@ Dht::sendAnnounceValue(const sockaddr *sa, socklen_t salen, TransId tid, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.put++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); }