diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index bbe13b8cc71286097b67807021d8fc3fbff2e62a..956d2158b5912fff61cd3e71f44d44b25656be41 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -79,7 +79,7 @@ public:
     void putEncrypted(InfoHash hash, InfoHash to, Value&& value, Dht::DoneCallback cb=nullptr);
     void putEncrypted(const std::string& key, InfoHash to, Value&& value, Dht::DoneCallback cb=nullptr);
 
-    void bootstrap(const std::vector<sockaddr_storage>& nodes);
+    void bootstrap(const std::vector<std::pair<sockaddr_storage, socklen_t>>& nodes);
     void bootstrap(const std::vector<Dht::NodeExport>& nodes);
 
     void dumpTables() const
diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index 0f325e539fac72f4da572c9276203ed79fc1b13b..ba563e85b950bcca4a61387b56facb926f27bcd3 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -334,12 +334,12 @@ DhtRunner::putEncrypted(const std::string& key, InfoHash to, Value&& value, Dht:
 }
 
 void
-DhtRunner::bootstrap(const std::vector<sockaddr_storage>& nodes)
+DhtRunner::bootstrap(const std::vector<std::pair<sockaddr_storage, socklen_t>>& nodes)
 {
     std::lock_guard<std::mutex> lck(storage_mtx);
     pending_ops.emplace([=](SecureDht& dht) {
         for (auto& node : nodes)
-            dht.pingNode((sockaddr*)&node, sizeof(node));
+            dht.pingNode((sockaddr*)&node.first, node.second);
     });
     cv.notify_all();
 }
diff --git a/tools/dhtchat.cpp b/tools/dhtchat.cpp
index 0bbae5b96a7f47ffd58bbe75d826f5cfca3587bb..e543877b4d773f85992f5717bae6e11b77e96385 100644
--- a/tools/dhtchat.cpp
+++ b/tools/dhtchat.cpp
@@ -114,7 +114,7 @@ main(int argc, char **argv)
     if (!port)
         port = 4222;
 
-    std::vector<sockaddr_storage> bootstrap_nodes {};
+    std::vector<std::pair<sockaddr_storage, socklen_t>> bootstrap_nodes {};
     while (i < argc) {
         addrinfo hints;
         memset(&hints, 0, sizeof(hints));
@@ -131,8 +131,8 @@ main(int argc, char **argv)
         infop = info;
         while (infop) {
             sockaddr_storage tmp;
-            memcpy(&tmp, infop->ai_addr, infop->ai_addrlen);
-            bootstrap_nodes.push_back(tmp);
+            std::copy_n((uint8_t*)infop->ai_addr, infop->ai_addrlen, (uint8_t*)&tmp);
+            bootstrap_nodes.emplace_back(tmp, infop->ai_addrlen);
             infop = infop->ai_next;
         }
         freeaddrinfo(info);
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index decef1559b07c250b422554cb8830bb2c1314c25..2a6444d175fd311ea8c6fe49fcba651edf1bb058 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -99,7 +99,7 @@ main(int argc, char **argv)
     if (!port)
         port = 4222;
 
-    std::vector<sockaddr_storage> bootstrap_nodes {};
+    std::vector<std::pair<sockaddr_storage, socklen_t>> bootstrap_nodes {};
     while (i < argc) {
         addrinfo hints;
         memset(&hints, 0, sizeof(hints));
@@ -116,8 +116,8 @@ main(int argc, char **argv)
         infop = info;
         while (infop) {
             sockaddr_storage tmp;
-            memcpy(&tmp, infop->ai_addr, infop->ai_addrlen);
-            bootstrap_nodes.push_back(tmp);
+            std::copy_n((uint8_t*)infop->ai_addr, infop->ai_addrlen, (uint8_t*)&tmp);
+            bootstrap_nodes.emplace_back(tmp, infop->ai_addrlen);
             infop = infop->ai_next;
         }
         freeaddrinfo(info);