diff --git a/include/opendht/node.h b/include/opendht/node.h
index d1a8ed464ddc8f10e8dfd8da1e1ae1bcaec88a55..7a4511c1985607249e5b62877c56730b713b9074 100644
--- a/include/opendht/node.h
+++ b/include/opendht/node.h
@@ -83,6 +83,8 @@ struct Node {
      */
     void reset() { pinged = 0; }
 
+    std::string toString() const;
+
     friend std::ostream& operator<< (std::ostream& s, const Node& h);
 
     static constexpr const std::chrono::minutes NODE_GOOD_TIME {120};
diff --git a/src/node.cpp b/src/node.cpp
index 36b93ef26d58b002372d0dc92f6a2b08cee7359e..0da55411abdbcf3a6aa04b9a0831c2d71b41d3d0 100644
--- a/src/node.cpp
+++ b/src/node.cpp
@@ -21,6 +21,8 @@
 
 #include "node.h"
 
+#include <sstream>
+
 namespace dht {
 
 constexpr std::chrono::minutes Node::NODE_EXPIRE_TIME;
@@ -77,6 +79,14 @@ Node::received(time_point now, bool answer)
     }
 }
 
+std::string
+Node::toString() const
+{
+    std::stringstream ss;
+    ss << (*this);
+    return ss.str();
+}
+
 std::ostream& operator<< (std::ostream& s, const Node& h)
 {
     s << h.id << " " << print_addr(h.ss, h.sslen);