如何在使用recvmsg()时从UDP数据包中检索源端口

时间:2012-02-17 23:16:22

标签: c linux udp

我在Linux中使用C有一个应用程序,其中我创建了一个接收IPv6 UDP数据包的套接字。

要接收数据包,我使用recvmsg(),因为我需要检索ifindex,我可以使用选项IPV6_PKTINFO从CMSG_DATA()获取。现在,我还需要从UDP数据包中读取源端口。有没有办法得到它?

1 个答案:

答案 0 :(得分:6)

当然可以,recvmsg看起来像这样:

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

struct msghdr包含msg_namemsg_namelen

struct msghdr {
   void         *msg_name;       /* optional address */
   socklen_t     msg_namelen;    /* size of address */
...

所以你可以为IPv4地址做这样的事情:

struct sockaddr_in *src = msg->msg_name;
uint16_t port = ntohs(src->sin_port);

并相应地调整(sockaddr_in6)IPv6地址。

修改

我完全忽略了评论中提到的getnameinfo。此函数获得struct sockaddr *,这意味着它不依赖于地址族。该功能功能强大,但如果你想要的只是端口,你可能对NI_NUMERICSERV感兴趣。