diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 83a9671b20..02b95f21ee 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -685,6 +685,7 @@ bool netplay_pre_frame(netplay_t *netplay) /* NAT traversal if applicable */ if (netplay->nat_traversal && + !netplay->nat_traversal_task_oustanding && netplay->nat_traversal_state.request_outstanding && !netplay->nat_traversal_state.have_inet4) { @@ -1198,7 +1199,10 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) ret = netplay_disconnect(netplay_data); goto done; case RARCH_NETPLAY_CTL_FINISHED_NAT_TRAVERSAL: + netplay_data->nat_traversal_task_oustanding = false; +#ifndef HAVE_SOCKET_LEGACY netplay_announce_nat_traversal(netplay_data); +#endif goto done; default: case RARCH_NETPLAY_CTL_NONE: diff --git a/network/netplay/netplay_io.c b/network/netplay/netplay_io.c index 1e7c51f3be..20090e7b9a 100644 --- a/network/netplay/netplay_io.c +++ b/network/netplay/netplay_io.c @@ -1432,5 +1432,6 @@ void netplay_announce_nat_traversal(netplay_t *netplay) void netplay_init_nat_traversal(netplay_t *netplay) { memset(&netplay->nat_traversal_state, 0, sizeof(netplay->nat_traversal_state)); + netplay->nat_traversal_task_oustanding = true; task_push_netplay_nat_traversal(&netplay->nat_traversal_state, netplay->tcp_port); } diff --git a/network/netplay/netplay_private.h b/network/netplay/netplay_private.h index 03b57f34d4..d76e193697 100644 --- a/network/netplay/netplay_private.h +++ b/network/netplay/netplay_private.h @@ -344,7 +344,7 @@ struct netplay uint16_t tcp_port; /* NAT traversal info (if NAT traversal is used and serving) */ - bool nat_traversal; + bool nat_traversal, nat_traversal_task_oustanding; struct natt_status nat_traversal_state; struct delta_frame *buffer;