这是一个多部分的答案,从其他 SO 和 SuperUser 的答案和一些猜测中收集。
通过 wifi 上的 UDP 广播进行 Mac 到 Mac 通信
第一件事是netcat(nc)的mac版本截至2018年10月不支持广播,所以你必须切换到“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
结果一号航站楼出现了TEST这个词!
当我在 2 号航站楼重新输入相同的命令时,1 号航站楼没有任何其他信息;由于我不明白的原因,“听”似乎是在听一条消息。但是,嘿,至少它能让我有所收获!
Mac 到平板电脑的通信
首先,在平板电脑上,我尝试模仿上述 mac 版本的收听端。 nc 的 termux 版本不支持 -u 标志,所以我不得不做点别的。我决定使用socat。作为第一步,我让它在 mac-to-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 上,在 Terminal 2 中,我再次输入了
Terminal 2: echo -n "TEST" | socat - udp-datagram:192.168.1.255:11011,broadcast
果然,TEST这个词出现在了平板电脑上!
更好的是,通过阅读我发现可以使用的文档
socat udp:recv:11011 -
它不仅会监听,还会继续监听,因此会一个接一个地报告多个 UDP 数据包。 (相比之下,udp-listen 似乎在等待一个数据包,然后尝试与该数据包的发送者进行通信,这根本不是我想要的。)