【问题标题】:UDP recvfrom call returns wrong port number. Why? [closed]UDP recvfrom 调用返回错误的端口号。为什么? [关闭]
【发布时间】:2010-07-28 21:07:22
【问题描述】:

我正在使用 UDP 进行“recvfrom”和“sendto”调用。 我有一个客户端,它只在端口 6000 上广播 UDP 数据包。 我有一台服务器,它在端口 6000 上绑定一个套接字,并执行一次 recvfrom。

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

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

提前致谢

编辑:我真的认为“否”答案中的“原因 2”可能是问题所在。如何查看?

【问题讨论】:

  • 发布您的代码,并说明您使用的操作系统。

标签: c sockets udp port


【解决方案1】:

这里有 2 个可能的原因:

  1. 在检查/显示之前,您没有将 sin_port 转换为主机顺序。 sin_port 采用网络字节序。也就是说,您可能会在小端机器上将端口显示为大端。

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

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

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

【讨论】:

  • 1) 我在调试器上检查结果,收到的端口与 6000 无关。recvfrom 地址的第一个字是:'4D120002',我期待 '70170002',因为6000 = 0x1770(我猜 0002 代表 INADDR)此外,每次运行客户端时,我发布的“4D12”这个数字都会发生变化。 2)是的,我认为问题可能出在客户端上。无论如何我可以检查它吗?无论如何我可以“修复”它。提前致谢。
  • udpPkg.udpRecvBuf 有多大?你为什么期待 6000 ?- recvfrom 地址给你 地址,而不是目标地址
  • 我使用 256 字节的缓冲区,我只发送 4 字节的数据包。我正在使用 C 客户端并尝试使用 C# 来执行此操作,但我遇到了同样的问题。我希望 CLR 运行时会检测到缓冲区溢出。
  • 如果每次客户端发送时数字都在变化,那么客户端确实在每次调用 send() 时使用随机源端口。如果您的接收代码要求它保持一致,则客户端需要将自身绑定到特定的 ip/port。
  • 但是你调用recvfrom,你说缓冲区有1024字节大,不要骗系统,设置为实际大小。您正在展示 C 代码 - CLR 运行时与...有什么关系?另外,您是否正在检查对 `bind` 的调用是否成功?或者..贴出真实代码。
【解决方案2】:

你是从网络字节序转换吗?

【讨论】:

  • 是的,我实际上是在调试器上检查它,而 sin_port 字段与 6000 无关,无论是 little-endian 还是 big-endian 编码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多