Set SO_REUSEADDR before bind for UDP

This commit is contained in:
2026-03-07 17:55:14 -05:00
parent 8a5b545573
commit 79e939f0b7

View File

@@ -44,6 +44,15 @@ int UDPClient::init() {
return -2;
}
constexpr int opt = 1;
#ifdef _WIN32
setsockopt(m_rx_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt));
setsockopt(m_tx_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt));
#else
setsockopt(m_rx_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(m_tx_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
#endif
timeval timeout{};
timeout.tv_sec = SOCKET_TIMEOUT_MS / 1000;
timeout.tv_usec = (SOCKET_TIMEOUT_MS % 1000) * 1000;
@@ -65,21 +74,12 @@ int UDPClient::init() {
if (int err = bind(m_rx_socket, reinterpret_cast<struct sockaddr *>(&server_addr),
sizeof(server_addr));
0 != err) {
spdlog::error("[UDP] Socket unable to bind");
spdlog::error("[UDP] Socket unable to bind to port {}", RX_PORT);
print_errno();
deinit();
return -1;
}
constexpr int opt = 1;
#ifdef _WIN32
setsockopt(m_rx_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt));
setsockopt(m_tx_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt));
#else
setsockopt(m_rx_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(m_tx_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
#endif
ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(RECV_MCAST.c_str());
mreq.imr_interface.s_addr = INADDR_ANY;
@@ -120,7 +120,12 @@ int UDPClient::init() {
print_errno();
}
#else
setsockopt(m_rx_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
if (setsockopt(m_rx_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
spdlog::error("[UDP] Failed to join multicast group");
print_errno();
deinit();
return -1;
}
#endif
this->m_initialized = true;