mirror of
https://github.com/BotChain-Robots/rpc.git
synced 2026-03-09 23:12:27 +01:00
Set SO_REUSEADDR before bind for UDP
This commit is contained in:
@@ -44,6 +44,15 @@ int UDPClient::init() {
|
|||||||
return -2;
|
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{};
|
timeval timeout{};
|
||||||
timeout.tv_sec = SOCKET_TIMEOUT_MS / 1000;
|
timeout.tv_sec = SOCKET_TIMEOUT_MS / 1000;
|
||||||
timeout.tv_usec = (SOCKET_TIMEOUT_MS % 1000) * 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),
|
if (int err = bind(m_rx_socket, reinterpret_cast<struct sockaddr *>(&server_addr),
|
||||||
sizeof(server_addr));
|
sizeof(server_addr));
|
||||||
0 != err) {
|
0 != err) {
|
||||||
spdlog::error("[UDP] Socket unable to bind");
|
spdlog::error("[UDP] Socket unable to bind to port {}", RX_PORT);
|
||||||
print_errno();
|
print_errno();
|
||||||
deinit();
|
deinit();
|
||||||
return -1;
|
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;
|
ip_mreq mreq;
|
||||||
mreq.imr_multiaddr.s_addr = inet_addr(RECV_MCAST.c_str());
|
mreq.imr_multiaddr.s_addr = inet_addr(RECV_MCAST.c_str());
|
||||||
mreq.imr_interface.s_addr = INADDR_ANY;
|
mreq.imr_interface.s_addr = INADDR_ANY;
|
||||||
@@ -120,7 +120,12 @@ int UDPClient::init() {
|
|||||||
print_errno();
|
print_errno();
|
||||||
}
|
}
|
||||||
#else
|
#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
|
#endif
|
||||||
|
|
||||||
this->m_initialized = true;
|
this->m_initialized = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user