如何在 C 中获取发送者的 UDP 端口?

问题描述 投票:0回答:6

我在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 数据包时检索此类信息?

谢谢

c sockets udp posix
6个回答
18
投票

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


6
投票

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

编辑: 使用这样的东西

struct sockaddr_in client;

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

client.sin_port
应该是发送者的端口。


1
投票

UDP 发送方端口将是暂时的。我认为除了报告之外,您不能将其用于任何其他用途。


0
投票

第五个参数可以转换为

struct sockaddr_in
,其中
sin_port
是远程端口号。


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.