UDP recvfrom调用返回错误的端口号。为什么?

时间:2010-07-28 21:07:23

标签: c sockets udp port

我使用UDP播放'recvfrom'和'sendto'来电。 我有一个客户端只在端口6000上广播UDP数据包。 我有一台服务器在端口6000上绑定套接字,并执行一次recvfrom。

问题是从recvfrom返回的struct sockaddr的sin_port成员总是不正确的。为什么呢?

我会发布一些源代码,但有人已经发布了这个问题(没有答案),而且我使用的代码与他几乎相同。此外,您可以阅读他的帖子获得有关此问题的更多信息:FORUM POST

提前致谢

编辑:我真的认为来自'nos'答案的'原因2'可能是问题所在。我怎么检查呢?

2 个答案:

答案 0 :(得分:6)

以下是两个可能的原因:

  1. 在检查/显示之前,您没有将sin_port转换为主机顺序。 sin_port来自网络端。那就是你可能会在一个小端机器上将端口显示为大端。

  2. 您的客户端使用随机源端口。因此,当您的目标端口为6000时,将随机选择客户端的源端口。 recvfrom为您提供源IP地址和源端口号。不是目的地港口。

  3. 如果不是这些,请提供一些相关的测试代码,以及您看到的实际值。你有可能,例如有一些缓冲区溢出,或其他可疑的东西。

    编辑,查看链接中的代码,将缓冲区大小(udpPkg.udpRecvBuf)硬编码为1024.缓冲区真的至少是1024大吗?如果没有,你可能会溢出udpPkg.udpRecvBuf

答案 1 :(得分:1)

您是从网络字节顺序转换的吗?