Это ответ, состоящий из нескольких частей, взятый из других ответов 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
, напротив, похоже, ожидает один пакет, а затем пытается связаться с отправителем этого пакета, а это совсем не то, что я хотел).