我想要一個伺服器發送廣播 UDP 封包,而另外兩個客戶端在同一台機器上接收它們。我能以某種方式做到這一點嗎?我將使用什麼 IP 位址?
@gravyface給了我希望,但我嘗試過:
- 伺服器發送到 127.255.255.255:54321,客戶端監聽 0.0.0.0:54321。
- 伺服器發送到 127.255.255.255:54321,客戶端監聽 127.0.0.1:54321。
- 伺服器發送到 127.255.255.255:54321,客戶端監聽 127.255.255.255:54321。
他們都沒有工作!:(
OBS:我正在使用 REUSE_ADDR 和 SO_BROADCAST 選項。
答案1
第一個視窗:
socat -u udp-recv:12345,reuseaddr -
第二個視窗:
socat -u udp-recv:12345,reuseaddr -
第三個窗口
socat - udp-sendto:127.255.255.255:12345,broadcast
然後在第三個視窗中輸入幾行文本,看看其他兩個視窗中是否有任何內容。
將“socat”替換為“strace -fe network socat”以查看實際進行的系統呼叫(假設您使用的是 Linux,其他 unice 具有等效項,有時稱為 tusc、struss 或 dtruss)。 socat 是開源的,二進位套件可用於大多數作業系統。
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
sendto(3, "qwe\n", 4, 0, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("127.255.255.255")}, 16) = 4
上面,接收「客戶端」綁定到 INADDR_ANY 位址。我發現但不確定為什麼,如果您綁定到環回子網路上的位址,您將看不到傳入的封包。
也可以看看:
$ ip route show table local dev lo scope link
broadcast 127.0.0.0 proto kernel src 127.0.0.1
broadcast 127.255.255.255 proto kernel src 127.0.0.1
如果客戶端綁定到 127.0.0.0 或 127.255.255.255 並且伺服器發送到相同位址(使用 SO_BROADCAST),那麼它也可以工作。
答案2
將廣播流量傳送至 127.255.255.255應該工作,但顯然測試一下(Wireshark/tcpdump 是你的朋友)。
顯然,您的客戶端也需要監聽環回設備。