获取收到的UDP数据包的目的地址

在收到UDP数据包之后,我需要用发送我要回复的数据包的地址回复发件人。

recvfrom调用让我得到发送者的地址,但是如何得到接收到的数据包的目的地址,它应该与本地主机的一个接口的地址相匹配?

您使用setsockopt设置IP_PKTINFO选项,然后使用recvmsg并在struct msghdr的msg_control成员中获取in_pktinfo结构。 in_pktinfo有一个包含目的地址的字段。

请参阅: http : //www.linuxquestions.org/questions/programming-9/how-to-get-destination-address-of-udp-packet-600103/其中我找到了答案的更多细节。

我已经构建了一个提取源,目标和接口地址的示例。 为简洁起见,不提供错误检查。

 // 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 }