BIG阳
我构建了一个示例,该示例提取了源地址,目标地址和接口地址。为简便起见,没有提供错误检查。// sock is bound AF_INET socket, usually SOCK_DGRAM// include struct in_pktinfo in the message "ancilliary" control datasetsockopt(sock, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt));// the control data is dumped herechar cmbuf[0x100];// the remote/source sockaddr is put herestruct sockaddr_in peeraddr;// if you want access to the data you need to init the msg_iovec fieldsstruct 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}