我在Linux下有以下典型的C语言代码来获取UDP数据:
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
mysock.sin_family = AF_INET;
mysock.sin_addr.s_addr = INADDR_ANY;
mysock.sin_port = my_port;
bind(sock, &mysock, sizeof(mysock);
recvfrom(sock, buf, PKTSZ, 0, &client, len);
以上所有代码都有效,但现在我需要找出发送者的 UDP 端口,是否有结构或系统调用可以用来在收到 UDP 数据包时检索此类信息?
谢谢
recvfrom(sock, buf, PKTSZ, 0, &client, len);
发送者套接字地址存储在代码的 client 变量中。要访问发送者端口,请使用 sockaddr_in 而不是 sockaddr。示例:
sockaddr_in client;
int len = sizeof(client);
recvfrom(sock, buf, PKTSZ, 0, (struct sockaddr *)&client, (socklen_t *)&len);
int port = ntohs(client.sin_port);
参考资料: Beej 网络编程指南 和 MSDN
recvfrom() 应该在第五个参数(struct sockaddr*)中将其返回给您。
编辑: 使用这样的东西
struct sockaddr_in client;
recvfrom(... (struct sockaddr*)&client ...);
client.sin_port
应该是发送者的端口。
UDP 发送方端口将是暂时的。我认为除了报告之外,您不能将其用于任何其他用途。
第五个参数可以转换为
struct sockaddr_in
,其中sin_port
是远程端口号。
将客户端转换为 sockaddr_in 解决了我的问题。
是的! 首先记住 ntohs()! 直到我使用程序员的计算器,我才意识到它存储为 BigEndian 15B3,而不是可能的临时端口 B315!