【问题标题】:Receive response after sending UDP broadcast发送UDP广播后接收响应
【发布时间】:2014-06-03 17:24:26
【问题描述】:

我遇到了广播问题:我可以发送消息,接收者接收并发送回消息,但我无法得到这些响应。不过它显示在wireshark上,所以它就在那里。

这是我在发件人端所做的:

  • 创建套接字
  • 将广播选项设置为 1
  • 设置为非阻塞
  • 使用连接将其设置为目标端口和广播 IP
  • 发送消息
  • 使用 recv() 继续接收它以获取响应

但是我没有在那个 recv 中得到响应,即使它显示在 Wireshark 上并且它没有被计算机拒绝(没有 ICMP 消息)。

这个过程有什么问题,还是我看的地方不对?

(顺便说一下,当不使用广播选项和目标IP时,它可以正常工作)

【问题讨论】:

  • 你能显示一些代码吗?您概述的代替代码的方法中可能存在许多可能的编码错误

标签: c sockets udp broadcast winsock2


【解决方案1】:

问题是您正在使用connect(),它将套接字与特定的远程 IP:Port 相关联,因此套接字将只能来自该特定远程 IP:Port 的 recv() 数据包而不能。您正在“连接”到广播 IP,这使您可以 send() 广播数据包,但您将收到来自各个对等 IP 的响应,因此 recv() 将静默丢弃所有响应,因为源 IP 不匹配您连接的 IP。

当您进行直接点对点通信时,使用connect()send()recv() 并让套接字为您管理 IP 是有意义的。但是在广播时,不要使用connect()!使用sendto() 而不是send() 将数据包发送到广播IP,然后使用recvfrom() 而不是recv() 允许来自任何对等IP 的响应(recvfrom() 将告诉您每个数据包来自的源IP )。

【讨论】:

  • 非常感谢!顺便说一下(现在)我一开始使用了 recvfrom,当我试图找出问题所在时,我将其更改为 recv。
猜你喜欢
  • 2020-02-21
  • 1970-01-01
  • 2021-07-30
  • 2012-06-05
  • 2015-03-14
  • 2018-02-27
  • 1970-01-01
  • 2011-10-02
  • 2013-05-22
相关资源
最近更新 更多