summaryrefslogtreecommitdiff
path: root/implementation/helper/1.66/boost/asio/detail/impl/socket_ops_ext.ipp
diff options
context:
space:
mode:
Diffstat (limited to 'implementation/helper/1.66/boost/asio/detail/impl/socket_ops_ext.ipp')
-rw-r--r--implementation/helper/1.66/boost/asio/detail/impl/socket_ops_ext.ipp76
1 files changed, 48 insertions, 28 deletions
diff --git a/implementation/helper/1.66/boost/asio/detail/impl/socket_ops_ext.ipp b/implementation/helper/1.66/boost/asio/detail/impl/socket_ops_ext.ipp
index 633d24e..4849766 100644
--- a/implementation/helper/1.66/boost/asio/detail/impl/socket_ops_ext.ipp
+++ b/implementation/helper/1.66/boost/asio/detail/impl/socket_ops_ext.ipp
@@ -59,20 +59,30 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count,
if (result >= 0) {
ec = boost::system::error_code();
- // Find destination address
- for (LPWSACMSGHDR cmsg = WSA_CMSG_FIRSTHDR(&msg);
- 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)
- {
- da = boost::asio::ip::address_v4(ntohl(pi->ipi_addr.s_addr));
- }
- }
+ // Find destination address
+ for (LPWSACMSGHDR cmsg = WSA_CMSG_FIRSTHDR(&msg);
+ cmsg != NULL;
+ cmsg = WSA_CMSG_NXTHDR(&msg, cmsg))
+ {
+ 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)
+ {
+ 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;
}
@@ -91,20 +101,30 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count,
if (result >= 0) {
ec = boost::system::error_code();
- // Find destination address
- for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
- 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)
- {
- da = boost::asio::ip::address_v4(ntohl(pi->ipi_addr.s_addr));
- }
- }
+ // Find destination address
+ for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg != NULL;
+ cmsg = CMSG_NXTHDR(&msg, cmsg))
+ {
+ 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)
+ {
+ 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;
#endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)