【问题标题】:Making UDP broadcast work with wifi router使 UDP 广播与 wifi 路由器一起工作
【发布时间】:2018-09-29 12:50:08
【问题描述】:

我想在一个非常简单的网络上测试 UDP 广播:一个完全没有连接到互联网的旧 wifi 路由器 (WRT54GS)、一个安卓平板电脑和我的 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 的人可以发现我明显的错误吗?

【问题讨论】:

    标签: udp broadcast packet netcat


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 2015-08-13
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多