我在Linux中使用C有一个应用程序,其中我创建了一个接收IPv6 UDP数据包的套接字。
要接收数据包,我使用recvmsg(),因为我需要检索ifindex,我可以使用选项IPV6_PKTINFO从CMSG_DATA()获取。现在,我还需要从UDP数据包中读取源端口。有没有办法得到它?
答案 0 :(得分:6)
当然可以,recvmsg
看起来像这样:
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
struct msghdr
包含msg_name
和msg_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
感兴趣。