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 ループを使用しようとしましたが-knc返されません。

#!/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を送信していません。クライアントは最初の2つの後に1秒間隔でXを送信し、サーバーはディスプレイ(当然のことですが-vクライアントXは送信も表示もされず、データはすぐに送信され表示されます(3秒後ではありません)。私にはわかりませんなぜ -v「5X文字をゆっくり送信する」という意味です。

のマニュアルページには-kこう書いてある

-u オプションと一緒に使用すると、サーバー ソケットは接続されず、複数のホストから UDP データグラムを受信できます。

これと一致して、サーバーは を使用するときログに-v記録しますが、 を使用するときログには記録しません。Connection from {host} {port} received!-ul-ulk容疑者「応答」データを送信するためのコードはソケットが接続されていることを前提としており、接続されていないままにしておくと応答が妨げられますが、ソースを詳しく調べて確認したわけではありません。

-q 0UDP では検出可能な「接続の終了」がありませんが、TCP (FIN 交換) では検出可能な「接続の終了」があるため、動作しません。クライアント データについて認識可能なものがある場合 (head -1常に 1 行である場合など)、論理的には、そのデータを認識してプロセスを強制終了し、ループを反復できるようにするものを作成することが可能ですncが、そのような認識/キラーで使用できる pid を取得する明確な方法を見つけることができませんでしたnc。他の誰かがここで実際の解決策を提供できる場合に備えて、CW を作成します。

関連情報