diff --git a/libp2p/Host.cpp b/libp2p/Host.cpp index 410699a55..e030e9a3b 100644 --- a/libp2p/Host.cpp +++ b/libp2p/Host.cpp @@ -209,7 +209,12 @@ void Host::determinePublic(string const& _publicAddress, bool _upnp) if (m_upnp && m_upnp->isValid() && m_peerAddresses.size()) { clog(NetNote) << "External addr:" << m_upnp->externalIP(); - int p = m_upnp->addRedirect(m_peerAddresses[0].to_string().c_str(), m_listenPort); + int p = 0; + for (auto const& addr : m_peerAddresses) + { + if (p = m_upnp->addRedirect(addr.to_string().c_str(), m_listenPort)) + break; + } if (p) clog(NetNote) << "Punched through NAT and mapped local port" << m_listenPort << "onto external port" << p << "."; else diff --git a/libp2p/UPnP.cpp b/libp2p/UPnP.cpp index 5ac3e9427..342dc58cd 100644 --- a/libp2p/UPnP.cpp +++ b/libp2p/UPnP.cpp @@ -122,21 +122,23 @@ int UPnP::addRedirect(char const* _addr, int _port) // Try direct mapping first (port external, port internal). char port_str[16]; + char ext_port_str[16]; sprintf(port_str, "%d", _port); if (!UPNP_AddPortMapping(m_urls->controlURL, m_data->first.servicetype, port_str, port_str, _addr, "ethereum", "TCP", NULL, NULL)) return _port; // Failed - now try (random external, port internal) and cycle up to 10 times. + srand(time(NULL)); for (unsigned i = 0; i < 10; ++i) { - _port = rand() % 65535 - 1024 + 1024; - sprintf(port_str, "%d", _port); - if (!UPNP_AddPortMapping(m_urls->controlURL, m_data->first.servicetype, NULL, port_str, _addr, "ethereum", "TCP", NULL, NULL)) + _port = rand() % (65535 - 1024) + 1024; + sprintf(ext_port_str, "%d", _port); + if (!UPNP_AddPortMapping(m_urls->controlURL, m_data->first.servicetype, ext_port_str, port_str, _addr, "ethereum", "TCP", NULL, NULL)) return _port; } // Failed. Try asking the router to give us a free external port. - if (UPNP_AddPortMapping(m_urls->controlURL, m_data->first.servicetype, port_str, NULL, _addr, "ethereum", "TCP", NULL, NULL)) + if (UPNP_AddPortMapping(m_urls->controlURL, m_data->first.servicetype, NULL, port_str, _addr, "ethereum", "TCP", NULL, NULL)) // Failed. Exit. return 0; diff --git a/libp2p/_libp2p.cpp b/libp2p/_libp2p.cpp index 440ba362b..59de254a5 100644 --- a/libp2p/_libp2p.cpp +++ b/libp2p/_libp2p.cpp @@ -1,9 +1,11 @@ #ifdef _MSC_VER +#define ETH_MINIUPNPC 1 #include "All.h" #include "Capability.cpp" #include "Common.cpp" #include "Host.cpp" #include "HostCapability.cpp" +#undef clogS #include "Session.cpp" #include "UPnP.cpp" -#endif +#endif \ No newline at end of file