Last active
August 29, 2015 14:07
-
-
Save zhangyuchi/b2d1b012ed4fa99870d8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// sock is bound AF_INET socket, usually SOCK_DGRAM | |
// include struct in_pktinfo in the message "ancilliary" control data | |
setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt)); | |
// the control data is dumped here | |
char cmbuf[0x100]; | |
// the remote/source sockaddr is put here | |
struct sockaddr_in peeraddr; | |
// if you want access to the data you need to init the msg_iovec fields | |
struct msghdr mh = { | |
.msg_name = &peeraddr, | |
.msg_namelen = sizeof(peeraddr), | |
.msg_control = cmbuf, | |
.msg_controllen = sizeof(cmbuf), | |
}; | |
recvmsg(sock, &mh, 0); | |
for ( // iterate through all the control headers | |
struct cmsghdr *cmsg = CMSG_FIRSTHDR(&mh); | |
cmsg != NULL; | |
cmsg = CMSG_NXTHDR(&mh, cmsg)) | |
{ | |
// ignore the control headers that don't match what we want | |
if (cmsg->cmsg_level != IPPROTO_IP || | |
cmsg->cmsg_type != IP_PKTINFO) | |
{ | |
continue; | |
} | |
struct in_pktinfo *pi = CMSG_DATA(cmsg); | |
// at this point, peeraddr is the source sockaddr | |
// pi->ipi_spec_dst is the destination in_addr | |
// pi->ipi_addr is the receiving interface in_addr | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment