@@ -37,9 +37,11 @@ static std::thread g_upnp_thread;
37
37
38
38
using namespace std ::chrono_literals;
39
39
static constexpr auto PORT_MAPPING_REANNOUNCE_PERIOD{20min};
40
+ static constexpr auto PORT_MAPPING_RETRY_PERIOD{5min};
40
41
41
- static void ThreadMapPort ()
42
+ static bool ProcessUpnp ()
42
43
{
44
+ bool ret = false ;
43
45
std::string port = strprintf (" %u" , GetListenPort ());
44
46
const char * multicastif = nullptr ;
45
47
const char * minissdpdpath = nullptr ;
@@ -84,11 +86,15 @@ static void ThreadMapPort()
84
86
r = UPNP_AddPortMapping (urls.controlURL , data.first .servicetype , port.c_str (), port.c_str (), lanaddr, strDesc.c_str (), " TCP" , 0 , " 0" );
85
87
86
88
if (r != UPNPCOMMAND_SUCCESS) {
89
+ ret = false ;
87
90
LogPrintf (" AddPortMapping(%s, %s, %s) failed with code %d (%s)\n " , port, port, lanaddr, r, strupnperror (r));
91
+ break ;
88
92
} else {
93
+ ret = true ;
89
94
LogPrintf (" UPnP Port Mapping successful.\n " );
90
95
}
91
96
} while (g_upnp_interrupt.sleep_for (PORT_MAPPING_REANNOUNCE_PERIOD));
97
+ g_upnp_interrupt.reset ();
92
98
93
99
r = UPNP_DeletePortMapping (urls.controlURL , data.first .servicetype , port.c_str (), " TCP" , 0 );
94
100
LogPrintf (" UPNP_DeletePortMapping() returned: %d\n " , r);
@@ -100,6 +106,15 @@ static void ThreadMapPort()
100
106
if (r != 0 )
101
107
FreeUPNPUrls (&urls);
102
108
}
109
+
110
+ return ret;
111
+ }
112
+
113
+ static void ThreadMapPort ()
114
+ {
115
+ do {
116
+ if (ProcessUpnp ()) return ;
117
+ } while (g_upnp_interrupt.sleep_for (PORT_MAPPING_RETRY_PERIOD));
103
118
}
104
119
105
120
void StartMapPort ()
0 commit comments