You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ntsi::StreamSocket::bind parameter reuseAddress is inconsistent on different platforms #169
The behavior of the method seems to be different on AIX and Linux:
auto err = socket1->bind(ntsa::Endpoint(ntsa::Ipv4Endpoint("127.0.0.1", 0)), true);
assert(!err);
ntsa::Endpoint endpoint;
socket->sourceEndpoint(&endpoint);
err = socket2->bind(ntsa::Endpoint(ntsa::Ipv4Endpoint("127.0.0.1", 0)), true);
assert(!err);
// on AIX the second bind succeeds, while on Linux this fails.
I attached the relevant code in ntsu_socketoptionutil.cpp below. I think SO_REUSEPORT is required for the above code to work on Linux.
I understand making the behavior consistent on all support platform might be very difficult or impossible, so it's not a straight forward fix.
ntsa::Error SocketOptionUtil::setReuseAddress(ntsa::Handle socket,
bool reuseAddress)
{
{
int optionValue = static_cast<int>(reuseAddress);
int rc = setsockopt(socket,
SOL_SOCKET,
SO_REUSEADDR,
reinterpret_cast<char*>(&optionValue),
sizeof(optionValue));
if (rc != 0) {
returnntsa::Error(errno);
}
}
#if defined(BSLS_PLATFORM_OS_AIX) || defined(BSLS_PLATFORM_OS_DARWIN) || \
defined(BSLS_PLATFORM_OS_FREEBSD)
{
int optionValue = static_cast<int>(reuseAddress);
int rc = setsockopt(socket,
SOL_SOCKET,
SO_REUSEPORT,
reinterpret_cast<char*>(&optionValue),
sizeof(optionValue));
if (rc != 0) {
returnntsa::Error(errno);
}
}
#endifreturnntsa::Error();
}
Activity