diff --git a/src/kernel_win/Communicator.cc b/src/kernel_win/Communicator.cc index a63ec889..13791008 100644 --- a/src/kernel_win/Communicator.cc +++ b/src/kernel_win/Communicator.cc @@ -104,21 +104,28 @@ static int __bind_and_listen(SOCKET listen_sockfd, const struct sockaddr *addr, static int __bind_any(SOCKET sockfd, int sa_family) { struct sockaddr_storage addr; + socklen_t addrlen; - memset(&addr, 0, sizeof (addr)); - - if (sa_family == AF_INET) { - (*(struct sockaddr_in*)&addr).sin_family = AF_INET; - (*(struct sockaddr_in*)&addr).sin_addr.s_addr = INADDR_ANY; - (*(struct sockaddr_in*)&addr).sin_port = 0; - } - else{ - (*(struct sockaddr_in6*)&addr).sin6_family = AF_INET6; - (*(struct sockaddr_in6*)&addr).sin6_addr = in6addr_any; - (*(struct sockaddr_in6*)&addr).sin6_port = 0; + memset(&addr, 0, sizeof (struct sockaddr_storage)); + addr.ss_family = sa_family; + if (sa_family == AF_INET) + { + struct sockaddr_in *sin = (struct sockaddr_in *)&addr; + sin->sin_addr.s_addr = INADDR_ANY; + sin->sin_port = 0; + addrlen = sizeof (struct sockaddr_in); } - - if (bind(sockfd, (const struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) + else if (sa_family == AF_INET6) + { + struct sockaddr_in6 sin6 = (struct sockaddr_in6 *)&addr; + sin6->sin6_addr = in6addr_any; + sin6->sin6_port = 0; + addrlen = sizeof (struct sockaddr_in6); + } + else + addrlen = sizeof (struct sockaddr_storage); + + if (bind(sockfd, (struct sockaddr *)&addr, addrlen) == SOCKET_ERROR) return -1; return 0;