如何在C中获取发件人的UDP端口?

时间:2009-03-31 18:31:57

标签: c udp

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

感谢

6 个答案:

答案 0 :(得分:11)

  

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's Guide to Network ProgrammingMSDN

答案 1 :(得分:6)

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

修改 使用类似这样的东西

struct sockaddr_in client;

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

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

答案 2 :(得分:1)

UDP发送端口是暂时的。我不认为你可以将它用于报告以外的任何事情。

答案 3 :(得分:0)

第五个参数可以强制转换为struct sockaddr_insin_port是远程端口号。

答案 4 :(得分:0)

将客户端转换为sockaddr_in解决了我的问题。

答案 5 :(得分:0)

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