summaryrefslogtreecommitdiff
path: root/implementation/helper/1.74/boost/asio/detail/impl/socket_ops_ext.ipp
diff options
context:
space:
mode:
Diffstat (limited to 'implementation/helper/1.74/boost/asio/detail/impl/socket_ops_ext.ipp')
-rw-r--r--implementation/helper/1.74/boost/asio/detail/impl/socket_ops_ext.ipp48
1 files changed, 34 insertions, 14 deletions
diff --git a/implementation/helper/1.74/boost/asio/detail/impl/socket_ops_ext.ipp b/implementation/helper/1.74/boost/asio/detail/impl/socket_ops_ext.ipp
index d9585f6..39e2ed8 100644
--- a/implementation/helper/1.74/boost/asio/detail/impl/socket_ops_ext.ipp
+++ b/implementation/helper/1.74/boost/asio/detail/impl/socket_ops_ext.ipp
@@ -67,14 +67,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;
@@ -100,14 +110,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;