Заставить UDP-трансляцию работать с WiFi-роутером - PullRequest
0 голосов
/ 29 сентября 2018

Я бы хотел проверить трансляцию UDP в очень простой сети: старый маршрутизатор Wi-Fi (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 голосов
/ 29 сентября 2018

Это ответ, состоящий из нескольких частей, взятый из других ответов SO и SuperUser, и немного догадок.

Связь Mac-to-Mac через широковещательную UDP-передачу по Wi-Fi

Первое, что Mac-версия netcat (nc) по состоянию на октябрь 2018 года не поддерживаетвещание, так что вы должны переключиться на «socat», который гораздо более общий и мощный в том, что он может посылать.Что касается стороны прослушивания, то, в конечном итоге, у меня получилось

Terminal 1: % nc  -l -u 11011

А как насчет отправляющей стороны?Ну, оказывается, мне нужно больше информации.Например, попытка сделать это с локальным хостом вообще не работает, потому что этот конкретный «интерфейс» (черт возьми, я ненавижу перегрузку слов в 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», соединение Ethernet с беспроводной сетью (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,Версия termux nc не поддерживала флаг -u, поэтому мне пришлось сделать что-то еще.Я решил использовать socat.В качестве первого шага, я установил, что работает Mac-to-Mac (конечно, через Wi-Fi роутер).Оказывается, что для прослушивания пакетов 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, напротив, похоже, ожидает один пакет, а затем пытается связаться с отправителем этого пакета, а это совсем не то, что я хотел).

...