diff options
Diffstat (limited to 'implementation/helper/1.70/boost/asio/detail/impl/socket_ops_ext.ipp')
-rw-r--r-- | implementation/helper/1.70/boost/asio/detail/impl/socket_ops_ext.ipp | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/implementation/helper/1.70/boost/asio/detail/impl/socket_ops_ext.ipp b/implementation/helper/1.70/boost/asio/detail/impl/socket_ops_ext.ipp index 5825796..a4546ca 100644 --- a/implementation/helper/1.70/boost/asio/detail/impl/socket_ops_ext.ipp +++ b/implementation/helper/1.70/boost/asio/detail/impl/socket_ops_ext.ipp @@ -64,14 +64,24 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count, cmsg != NULL; cmsg = WSA_CMSG_NXTHDR(&msg, cmsg)) { - if (cmsg->cmsg_level != IPPROTO_IP || cmsg->cmsg_type != IP_PKTINFO) - continue; - - struct in_pktinfo *pi = (struct in_pktinfo *) WSA_CMSG_DATA(cmsg); - if (pi) + if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) + { + struct in_pktinfo *pi = (struct in_pktinfo *) WSA_CMSG_DATA(cmsg); + if (pi) + { + da = boost::asio::ip::address_v4(ntohl(pi->ipi_addr.s_addr)); + } + } else + if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) { - da = boost::asio::ip::address_v4(ntohl(pi->ipi_addr.s_addr)); - } + struct in6_pktinfo *pi = (struct in6_pktinfo *) WSA_CMSG_DATA(cmsg); + if (pi) + { + boost::asio::ip::address_v6::bytes_type b; + memcpy(b.data(), pi->ipi6_addr.s6_addr, sizeof(pi->ipi6_addr.s6_addr)); + da = boost::asio::ip::address_v6(b); + } + } } } else { dwNumberOfBytesRecvd = -1; @@ -96,14 +106,24 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count, cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) { - if (cmsg->cmsg_level != IPPROTO_IP || cmsg->cmsg_type != IP_PKTINFO) - continue; - - struct in_pktinfo *pi = (struct in_pktinfo *) CMSG_DATA(cmsg); - if (pi) + if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) + { + struct in_pktinfo *pi = (struct in_pktinfo *) CMSG_DATA(cmsg); + if (pi) + { + da = boost::asio::ip::address_v4(ntohl(pi->ipi_addr.s_addr)); + } + } else + if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) { - da = boost::asio::ip::address_v4(ntohl(pi->ipi_addr.s_addr)); - } + struct in6_pktinfo *pi = (struct in6_pktinfo *) CMSG_DATA(cmsg); + if (pi) + { + boost::asio::ip::address_v6::bytes_type b; + memcpy(b.data(), pi->ipi6_addr.s6_addr, sizeof(pi->ipi6_addr.s6_addr)); + da = boost::asio::ip::address_v6(b); + } + } } } return result; |