在广播应答的所有接口上进行UDP广播

时间:2014-04-01 21:59:26

标签: linux udp posix broadcast

我有一个硬件设备连接在一个可用的网络接口上(通常不知道哪一个)可以回复UDP广播消息和UDP广播消息。我需要能够发送消息并接收广播答案。

从stackoverflow上的其他主题,我已经能够使其中的一部分工作,但不能同时发送和接收。目前我做以下事情:

  • 对于getifaddrs(&ifaces)iface->ifa_addr->sa_family == AF_INET
  • 列出的每个界面
  • 使用socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
  • 创建套接字
  • 使用setsockopt(sock, SOL_SOCKET, SO_BROADCAST, ...)
  • 将套接字设置为广播
  • bind()ifaces->ifa_addr getifaddrs()的地址,其中0为端口(第一个空闲端口)
  • 使用sendto()从每个已打开的套接字向INADDR_BROADCAST发送数据包
  • 在n个并行线程中(每个插槽一个)我等待recvfrom()
  • 的答案

所以,我启动了wireshark并且消息被正确发送到所有接口,硬件在广播(255.255.255.255)中正确地在发送数据包的同一端口上回答,但recvfrom()从不返回数据,它只是等待。使用相同的代码,如果我绑定到INADDR_ANY而不是ifaces->ifa_addr并在硬件的实际IP而不是sendto()上运行INADDR_BROADCAST,广播答案会被捕获而没有问题。

究竟发生了什么?为什么第一种情况没有得到答案?如何在多个接口上广播发送

顺便说一句,root访问不是一个选项,所以我不能setsockopt(..., SOL_SOCKET, SO_BINDTODEVICE, "ifacename")。操作系统是Linux。

0 个答案:

没有答案