| 76 | } |
| 77 | |
| 78 | bool ExtractDestinationAddress(TMsgHdr& msgHdr, sockaddr_in6* addrBuf) { |
| 79 | Zero(*addrBuf); |
| 80 | #ifdef _win_ |
| 81 | Y_UNUSED(msgHdr); |
| 82 | Y_UNUSED(addrBuf); |
| 83 | return false; |
| 84 | #else |
| 85 | cmsghdr* cmsg; |
| 86 | for (cmsg = CMSG_FIRSTHDR(&msgHdr); cmsg != nullptr; cmsg = CMSG_NXTHDR(&msgHdr, cmsg)) { |
| 87 | if ((cmsg->cmsg_level == IPPROTO_IPV6) && (cmsg->cmsg_type == IPV6_PKTINFO)) { |
| 88 | in6_pktinfo* i = (in6_pktinfo*)CMSG_DATA(cmsg); |
| 89 | addrBuf->sin6_addr = i->ipi6_addr; |
| 90 | addrBuf->sin6_family = AF_INET6; |
| 91 | return true; |
| 92 | } |
| 93 | } |
| 94 | return false; |
| 95 | #endif |
| 96 | } |
| 97 | |
| 98 | // all send and recv methods are thread safe! |
| 99 | class TAbstractSocket: public ISocket { |