使wifi路由器可以进行UDP广播

时间:2018-09-29 12:50:09

标签: udp broadcast packet netcat

我想在一个非常简单的网络上测试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的人可以发现我的明显错误吗?

1 个答案:

答案 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似乎在等待一个数据包,然后尝试与该数据包的发送者进行通讯,这根本不是我想要的。)