5

我在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 数据包时,是否有可以用来检索此类信息的结构或系统调用?

谢谢

4

6 回答 6

17

recvfrom(sock, buf, PKTSZ, 0, &client, len);

发件人套接字地址存储在代码的客户端变量中。要访问发件人端口,请使用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

于 2009-03-31T19:16:29.263 回答
6

recvfrom() 应该在第五个参数(struct sockaddr*)中返回给你。

编辑: 使用这样的东西

struct sockaddr_in client;

recvfrom(... (struct sockaddr*)&client ...);

client.sin_port应该是发件人的端口。

于 2009-03-31T18:38:30.667 回答
1

UDP 发送方端口将是瞬态的。我认为您不能将其用于报告以外的任何其他用途。

于 2009-03-31T18:42:42.403 回答
0

第五个参数可以强制转换为struct sockaddr_in,并且有sin_port远程端口号。

于 2009-03-31T19:21:07.147 回答
0

将客户端投射到 sockaddr_in 解决了我的问题。

于 2009-03-31T19:43:52.133 回答
0

是的!首先记住 ntohs() !直到我使用程序员的计算器,我才意识到它被存储为 BigEndian 15B3,而不是可能的临时端口 B315!

于 2019-10-24T16:17:23.770 回答