我有一个硬件设备连接在一个可用的网络接口上(通常不知道哪一个)可以回复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
发送数据包recvfrom()
所以,我启动了wireshark并且消息被正确发送到所有接口,硬件在广播(255.255.255.255)中正确地在发送数据包的同一端口上回答,但recvfrom()
从不返回数据,它只是等待。使用相同的代码,如果我绑定到INADDR_ANY
而不是ifaces->ifa_addr
并在硬件的实际IP而不是sendto()
上运行INADDR_BROADCAST
,广播答案会被捕获而没有问题。
究竟发生了什么?为什么第一种情况没有得到答案?如何在多个接口上广播发送和?
顺便说一句,root访问不是一个选项,所以我不能setsockopt(..., SOL_SOCKET, SO_BINDTODEVICE, "ifacename")
。操作系统是Linux。