Joh*_*ohn 0 udp broadcast packet netcat
我想在一个非常简单的网络上测试 UDP 广播:一个根本没有连接到互联网的旧 wifi 路由器(WRT54GS)、一个 Android 平板电脑和我的 MacBook:
[Tablet] <\/\/\/\/\/> [Wifi Router] <\/\/\/\/\/> [Macbook]
Run Code Online (Sandbox Code Playgroud)
其中波浪线表示无线连接。
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
Run Code Online (Sandbox Code Playgroud)
我相当确定我在这里遗漏了一些明显的东西。熟悉 nc 的人能发现我明显的错误吗?
这是一个由多个部分组成的答案,是从其他 SO 和超级用户答案以及一些猜测中收集到的。
通过 WiFi 上的 UDP 广播进行 Mac 到 Mac 通信
首先,截至 2018 年 10 月,Mac 版本的 netcat (nc) 不支持广播,因此您必须切换到“socat”,它在发送内容方面更加通用和强大。至于聆听方面,最终对我有用的是
Terminal 1: % nc -l -u 11011
Run Code Online (Sandbox Code Playgroud)
那么发送方呢?好吧,事实证明我需要更多信息。例如,在本地主机上尝试这个根本不起作用,因为那个特定的“界面”(天哪,我讨厌 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>
Run Code Online (Sandbox Code Playgroud)
其中大部分对我来说毫无意义。但看看“en0”,即与无线网络 (192.168) 的以太网连接。那里的数据确实能告诉你一些东西。告诉flags
您它支持广播和组播。晚了两行,这个词broadcast
再次出现,后面跟着192.168.1.255
,这向我暗示这可能是发送广播数据包的正确地址。
考虑到这一点,我尝试了以下方法:
Terminal 2: % echo -n "TEST" | socat - udp-datagram:192.168.1.255:11011,broadcast
Run Code Online (Sandbox Code Playgroud)
结果一号航站楼里,TEST
出现了这个词!
当我在终端 2 中重新输入相同的命令时,终端 1 中什么也没有出现;似乎“监听”正在监听一条消息,原因我不明白。但是,嘿,至少它让我到达某个地方!
Mac 到平板电脑的通信
首先,在平板电脑上,我尝试模仿上面 Mac 版本的聆听端。termux 版本nc
不支持该-u
标志,因此我不得不做其他事情。我决定使用socat。第一步,我让它在 mac 到 mac 上工作(当然是通过 wifi 路由器)。事实证明,要侦听 UDP 数据包,您必须使用udp-listen
而不是udp-datagram
,但除此之外它非常简单。最后,它看起来像这样:
Terminal 1: % socat udp-listen:11011 -
Run Code Online (Sandbox Code Playgroud)
意思是“监听端口 11011 上的内容并复制到标准输出”,以及
Terminal 2: % echo -n "TEST" | socat - udp-datagram:192.168.1.255:11011,broadcast
Run Code Online (Sandbox Code Playgroud)
总之,这将数据从终端 2 传输到终端 1。
然后我在平板电脑上尝试了一下。正如我提到的,nc
平板电脑上的功能很弱。但socat
完全失踪了。
我试了一下,发现没有安装,就安装了。
完成此操作后,我在平板电脑上输入
Tablet: % socat udp-listen:11011 -
Run Code Online (Sandbox Code Playgroud)
在 Mac 上,在 Terminal 2 中,我再次输入
Terminal 2: echo -n "TEST" | socat - udp-datagram:192.168.1.255:11011,broadcast
Run Code Online (Sandbox Code Playgroud)
果然,TEST
平板电脑上出现了这个词!
更好的是,通过阅读文档,我发现我可以使用
socat udp:recv:11011 -
Run Code Online (Sandbox Code Playgroud)
它不仅监听,而且继续监听,因此会一个接一个地报告多个 UDP 数据包。(udp-listen
相比之下,似乎等待一个数据包,然后尝试与该数据包的发送者进行通信,这根本不是我想要的。)
归档时间: |
|
查看次数: |
5209 次 |
最近记录: |