From 1d2fd416d0130789a32966f1c3c56dfd9f756f51 Mon Sep 17 00:00:00 2001 From: Boris Rasin Date: Mon, 16 Feb 2015 14:02:48 +0200 Subject: [PATCH] Fix winrt udp socket bind for "any" address/port (take #2). --- .../impl/winrt_dsocket_service_base.ipp | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/asio/include/asio/detail/impl/winrt_dsocket_service_base.ipp b/asio/include/asio/detail/impl/winrt_dsocket_service_base.ipp index 1e477192b8..66e3309a50 100644 --- a/asio/include/asio/detail/impl/winrt_dsocket_service_base.ipp +++ b/asio/include/asio/detail/impl/winrt_dsocket_service_base.ipp @@ -465,18 +465,59 @@ asio::error_code winrt_dsocket_service_base::do_bind( } char addr_string[max_addr_v6_str_len]; + bool addr_unspecified = false; unsigned short port; switch (reinterpret_cast(addr)->sa_family) { case ASIO_OS_DEF(AF_INET): - socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET), + if (reinterpret_cast(addr)->sin_addr.s_addr + == 0) + addr_unspecified = true; + else + socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET), &reinterpret_cast(addr)->sin_addr, addr_string, sizeof(addr_string), 0, ec); port = socket_ops::network_to_host_short( reinterpret_cast(addr)->sin_port); break; case ASIO_OS_DEF(AF_INET6): - socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6), + if ( + reinterpret_cast(addr)->sin6_addr.s6_addr[0] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[1] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[2] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[3] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[4] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[5] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[6] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[7] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[8] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[9] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[10] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[11] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[12] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[13] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[14] == 0 && + reinterpret_cast(addr)->sin6_addr.s6_addr[15] == 0 + ) + addr_unspecified = true; + else + socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6), &reinterpret_cast(addr)->sin6_addr, addr_string, sizeof(addr_string), 0, ec); port = socket_ops::network_to_host_short( @@ -490,10 +531,8 @@ asio::error_code winrt_dsocket_service_base::do_bind( if (!ec) try { async_manager_.sync(impl.socket_->BindEndpointAsync( - INET_IS_ADDR_UNSPECIFIED( - reinterpret_cast(addr)->sa_family, addr) ? - nullptr : ref new Windows::Networking::HostName( - winrt_utils::string(addr_string)), + addr_unspecified ? nullptr : ref new + Windows::Networking::HostName(winrt_utils::string(addr_string)), port ? winrt_utils::string(port) : ""), ec); } catch (Platform::Exception^ e)