我想有一台服务器在同一台机器上发送广播UDP数据包和其他两个客户端,接收它们。 我能做些什么吗? 我会使用什么IP地址?
@gravyface给了我希望,但我试过:
他们没有工作! 🙁
OBS:我正在使用REUSE_ADDR和SO_BROADCAST选项。
第一个窗口:
socat -u udp-recv:12345,reuseaddr -
第二个窗口:
socat -u udp-recv:12345,reuseaddr -
第三个窗口
socat - udp-sendto:127.255.255.255:12345,broadcast
然后在第三个窗口中input几行文字,看看是否有其他两个文字。
将“socat”replace为“strace -fe-network socat”,看看实际上正在调用什么系统调用(假设你在Linux上,其他的unice有时候被称为tusc,struss或dtruss)。 socat是开源的,二进制包可用于大多数操作系统。
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3 setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0 sendto(3, "qwe\n", 4, 0, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("127.255.255.255")}, 16) = 4
以上,接收“客户端”绑定到INADDR_ANY地址。 我发现并不知道为什么,如果绑定到回环子网上的地址,则看不到数据包进入。
也可以看看:
$ ip route show table local dev lo scope link broadcast 127.0.0.0 proto kernel src 127.0.0.1 broadcast 127.255.255.255 proto kernel src 127.0.0.1
如果客户端绑定到127.0.0.0或127.255.255.255和服务器发送到相同的地址(与SO_BROADCAST),那么它也可以。
发送广播stream量到127.255.255.255 应该工作,但显然是testing出来(和Wireshark / tcpdump是你的朋友在这里)。
显然你的客户也需要在回环设备上进行监听。