Netcat UDP 伺服器未傳送回應

Netcat UDP 伺服器未傳送回應

我試圖讓 OpenBSD netcat 監聽特定連接埠(3333)和介面(10.42.0.1)上的 UDP 連接並發送固定回應。為了實現這一目標,我這樣做:

echo "asd" | nc -k -u -l -p 3333 -s 10.42.0.1 -v

然後我透過執行以下操作發送訊息:

echo qwe | nc -u 10.42.0.1 3333 -v

輸出是

# Server side
Bound on h9ct3d3 3333
XXXXXqwe

# Client side
Connection to 10.42.0.1 3333 port [udp/*] succeeded!

正如您所看到的,客戶端沒有收到asd.但是,如果我刪除-k,它確實會收到它:

##### Server side
echo "asd" | nc -u -l -p 3333 -s 10.42.0.1 -v
Bound on h9ct3d3 3333
# ...
# Wait for the client to execute
# ...
Connection received on h9ct3d3 51318
XXXXXqwe

##### Client side
echo qwe | nc -u 10.42.0.1 3333 -v
# ...
# Wait for the above 'X'to finish
# ...
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
asd

我嘗試使用不帶 的 while 循環-k,但nc從未返回:

#!/bin/bash

while true
do
    echo "Host message" | nc -q 0 -u -l -p 3333 -s 10.42.0.1 -v
    echo "restarting..."
done

我怎樣才能做到這一點?

我的 netcat 版本是:

OpenBSD netcat (Debian patchlevel 1.206-1ubuntu1)

PD。為什麼nc伺服器會「發送」那些奇怪的X字元?客戶從不閱讀它們,只是等待它們完成。它們似乎每 1 秒顯示一次。

答案1

伺服器沒有發送 X;客戶端在前兩個之後每隔 1 秒發送它們,伺服器顯示他們(理應如此)。如果您-v脫下客戶,X 不會發送或顯示,資料會立即發送並顯示(不是在 3 秒後)。我沒有任何線索為什麼 -v意思是「緩慢發送 5 X 個字元」!

手冊頁-k

當與-u選項一起使用時,伺服器套接字不連接,並且可以接收來自多個主機的UDP資料封包。

與此一致,伺服器在使用時-v記錄日誌,但在使用時不記錄日誌。我Connection from {host} {port} received!-ul-ulk懷疑發送「回應」資料的程式碼依賴正在連接的套接字,因此不連接它會阻止回應,但我還沒有挖掘原始程式碼來驗證。

-q 0不會起作用,因為 UDP 中沒有可檢測的“連接結束”,而 TCP(FIN 交換)中有。如果你的客戶端資料有一些可識別的東西——例如head -1它總是一行——從邏輯上講,應該可以編寫一些東西來識別該資料並殺死nc允許循環迭代的進程,但我還沒有這樣做能夠找到一種乾淨的方法來獲取nc此類識別器/殺手可用的 pid。製作 CW 以防其他人可以在這裡提供真正的解決方案。

相關內容