我可以在單機上測試廣播包嗎?

我可以在單機上測試廣播包嗎?

我想要一個伺服器發送廣播 UDP 封包,而另外兩個客戶端在同一台機器上接收它們。我能以某種方式做到這一點嗎?我將使用什麼 IP 位址?


@gravyface給了我希望,但我嘗試過:

  1. 伺服器發送到 127.255.255.255:54321,客戶端監聽 0.0.0.0:54321。
  2. 伺服器發送到 127.255.255.255:54321,客戶端監聽 127.0.0.1:54321。
  3. 伺服器發送到 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 是你的朋友)。

顯然,您的客戶端也需要監聽環回設備。

相關內容