SO_REUSEADDR on Windows is actually akin to SO_REUSEPORT on Linux/BSD. ie it allows 2 apps to listen to the same port at once. Thus we must not set it on Win32 platforms See http://msdn.microsoft.com/en-us/library/windows/desktop/ms740621.aspx Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/rpc/virnetsocket.c | 16 ++++++++++++++++ src/util/virportallocator.c | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c index 2e94a6c..65efdb6 100644 --- a/src/rpc/virnetsocket.c +++ b/src/rpc/virnetsocket.c @@ -255,11 +255,18 @@ int virNetSocketNewListenTCP(const char *nodename, goto error; } +#ifndef WIN32 + /* + * SO_REUSEADDR on Windows is actually akin to SO_REUSEPORT + * on Linux/BSD. ie it allows 2 apps to listen to the same + * port at once. Thus we must not set it on Win32 platforms + */ int opt = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { virReportSystemError(errno, "%s", _("Unable to enable port reuse")); goto error; } +#endif #ifdef IPV6_V6ONLY if (runp->ai_family == PF_INET6) { @@ -460,7 +467,9 @@ int virNetSocketNewConnectTCP(const char *nodename, runp = ai; while (runp) { +#ifndef WIN32 int opt = 1; +#endif if ((fd = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol)) < 0) { @@ -468,9 +477,16 @@ int virNetSocketNewConnectTCP(const char *nodename, goto error; } +#ifndef WIN32 + /* + * SO_REUSEADDR on Windows is actually akin to SO_REUSEPORT + * on Linux/BSD. ie it allows 2 apps to listen to the same + * port at once. Thus we must not set it on Win32 platforms + */ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { VIR_WARN("Unable to enable port reuse"); } +#endif if (connect(fd, runp->ai_addr, runp->ai_addrlen) >= 0) break; diff --git a/src/util/virportallocator.c b/src/util/virportallocator.c index ed7bdc2..0f22ea1 100644 --- a/src/util/virportallocator.c +++ b/src/util/virportallocator.c @@ -116,7 +116,9 @@ static int virPortAllocatorBindToPort(bool *used, struct sockaddr* addr; size_t addrlen; int v6only = 1; +#ifndef WIN32 int reuse = 1; +#endif int ret = -1; int fd = -1; bool ipv6 = false; @@ -143,12 +145,19 @@ static int virPortAllocatorBindToPort(bool *used, goto cleanup; } +#ifndef WIN32 + /* + * SO_REUSEADDR on Windows is actually akin to SO_REUSEPORT + * on Linux/BSD. ie it allows 2 apps to listen to the same + * port at once. Thus we must not set it on Win32 platforms + */ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse)) < 0) { virReportSystemError(errno, "%s", _("Unable to set socket reuse addr flag")); goto cleanup; } +#endif if (ipv6 && setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&v6only, sizeof(v6only)) < 0) { -- 1.9.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list