我想在一个非常简单的网络上测试UDP广播:一个根本未连接到互联网的旧wifi路由器(WRT54GS),一个Android平板电脑和我的Macbook:
[Tablet] <\/\/\/\/\/> [Wifi Router] <\/\/\/\/\/> [Macbook]
其中的波浪线表示无线连接。
Macbook的IP地址为192.168.1.101,平板电脑的IP地址为192.168.1.102。路由器是192.168.1.1。
为避免过多的底层细节,我想使用netcat进行测试。我决定使用端口11011,因为它易于键入。
作为第一步,我想我会尝试将Macbook的工作重新做回去。在两个终端窗口中,我运行了这些程序
窗口1:
% nc -ul 11011
我首先开始,然后:
窗口2:
% echo 'foo' | nc -v -u 255.255.255.255 11011
窗口1中什么都没有显示。窗口2中的结果是:
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif (null)
src 192.168.1.2 port 61985
dst 255.255.255.255 port 11011
rank info not available
我敢肯定,我在这里遗漏了一些明显的东西。熟悉nc的人可以发现我的明显错误吗?
答案 0 :(得分:2)
这是一个多部分的答案,是从其他SO和SuperUser答案以及一些猜测中得出的。
通过UDP在wifi上广播的Mac到Mac通信
第一件事是,截至2018年10月的Mac版本的netcat(nc)不支持广播,因此您必须切换到“ socat”,它可以发送的内容更加通用和强大。至于聆听方面,最终对我有用的是
Terminal 1: % nc -l -u 11011
发送方呢?好吧,事实证明我需要更多信息。例如,尝试使用localhost根本不起作用,因为该特定的“接口”(天哪,我讨厌CS中单词的重载;作为一个数学家,我希望CS人士可以从我们的经验中学到这是个坏主意...)不支持广播。我怎么学到的呢?通过ifconfig
,这是一个显示如何配置网络的工具。就我而言,输出为:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 98:01:a7:8a:6b:35
inet 192.168.1.101 netmask 0xffffff00 broadcast 192.168.1.255
media: autoselect
status: active
en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
options=60<TSO4,TSO6>
ether 4a:00:05:f3:ac:30
media: autoselect <full-duplex>
status: inactive
en2: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
options=60<TSO4,TSO6>
ether 4a:00:05:f3:ac:31
media: autoselect <full-duplex>
status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether 4a:00:05:f3:ac:30
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en1 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 5 priority 0 path cost 0
member: en2 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 6 priority 0 path cost 0
media: <unknown type>
status: inactive
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
ether 0a:01:a7:8a:6b:35
media: autoselect
status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
ether 7e:00:76:6d:5c:09
inet6 fe80::7c00:76ff:fe6d:5c09%awdl0 prefixlen 64 scopeid 0x9
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
inet6 fe80::773a:6d9e:1d47:7502%utun0 prefixlen 64 scopeid 0xa
nd6 options=201<PERFORMNUD,DAD>
其中大部分对我而言毫无意义。但是请看“ en0”,这是与无线网络的以太网连接(192.168)。那里的数据确实告诉您一些信息。 flags
告诉您它支持广播和多播。晚两行,再次出现broadcast
一词,接着出现192.168.1.255
,这向我暗示这可能是向其发送广播数据包的正确地址。
考虑到这一点,我尝试了以下方法:
Terminal 2: % echo -n "TEST" | socat - udp-datagram:192.168.1.255:11011,broadcast
结果是在1号航站楼出现了TEST
一词!
当我在2号航站楼中键入相同的命令时,在1号航站楼中什么也没出现;似乎“听”是在听一条消息,原因是我不明白。但是,嘿,至少它使我到了某个地方!
Mac与平板电脑的通信
首先,在平板电脑上,我尝试模仿上述Mac版本的监听方面。 nc
的termux版本不支持-u
标志,因此我不得不做其他事情。我决定使用socat。第一步,我使它可以在Mac到Mac上运行(当然是通过wifi路由器)。事实证明,要侦听UDP数据包,您必须使用udp-listen
而不是udp-datagram
,但是否则非常简单。最后,它看起来像这样:
Terminal 1: % socat udp-listen:11011 -
意思是“侦听端口11011上的内容并复制到标准输出”,并且
Terminal 2: % echo -n "TEST" | socat - udp-datagram:192.168.1.255:11011,broadcast
这是从2号航站楼到1号航站楼的数据。
然后我在平板电脑上尝试了它。正如我所提到的,平板电脑上的nc
很小。但是socat
完全丢失了。
我尝试过,发现它没有安装,然后安装。
完成此操作后,在平板电脑上打字
Tablet: % socat udp-listen:11011 -
在Mac上,在2号航站楼,我再次输入
Terminal 2: echo -n "TEST" | socat - udp-datagram:192.168.1.255:11011,broadcast
当然,平板电脑上出现了TEST
一词!
更好的是,通过阅读我发现可以使用的文档
socat udp:recv:11011 -
不仅会监听,而且会继续监听,因此将一个接一个地报告多个UDP数据包。 (相比之下,{udp-listen
似乎在等待一个数据包,然后尝试与该数据包的发送者进行通讯,这根本不是我想要的。)