发送UDP广播后接收响应

时间:2014-06-03 17:24:26

标签: c sockets udp broadcast winsock2

我遇到广播问题:我可以发送消息,接收方收到消息并将其发回,但我无法得到这些回复。然而,它显示在wireshark上,所以它就在那里。

这是我在发件人的最后所做的事情:

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

但是我不能在该recv中得到回复,即使它在Wireshark上显示并且它没有被计算机拒绝(没有ICMP消息)。

这个过程有什么问题,或者我没找对地方?

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

1 个答案:

答案 0 :(得分:4)

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

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