8

netcat を使用して NAT トラバーサル プロトコルをシミュレートしようとしています。

ポート 6666 で UDP パケットをリッスンしているインスタンスが 1 つあります。

nc -ul 6666

別のターミナル ウィンドウで、定期的にポート 6666 から UDP パケットを送信しようとしています (ルーターのリターン パスを開くためです。これは、ポートを再度開くために 20 秒ごとに繰り返されるスクリプト内にあります)。

nc -u -p6666 mypinghost.com 4444

問題は、この ping 呼び出しで netcat が失敗し、次のメッセージが表示されることです。

nc: バインドに失敗しました: アドレスは既に使用されています

これは、ポート 6666 にバインドされているリスナーが別のプロセスがそのポートから送信するのをブロックしているか、または netcat がリッスンするために 6666 にバインドしようとしていることを意味します。

これはまさに netcat の書き方ですか、それともリッスンするポートにバインドせずにパケットを送信できるようにする方法はありますか?

4

2 に答える 2

10

nc -ul 6666

UDPポート6666でリッスンします。

nc -u -p6666 mypinghost.com 4444

送信元ポートとしてUDPポート6666を使用して、mypinghost:4444に送信します。

nc:バインドに失敗しました:アドレスはすでに使用されています

これは2回目のnetcat呼び出しで、最初の呼び出しで6666がすでに使用されています。

これは、ポート6666にバインドしたリスナーが、別のプロセスがそのポートから送信するのをブロックしていることを意味します

正しい。

または、netcatが6666にバインドしてリッスンしようとしている可能性があります。

そして 間違いなくそれ。あなたはそれをするようにそれを言ったので、それはそれをしました。

同じホスト内の2つのプロセス間で実行しようとしていることは不可能です。を使用しない限り、一度に1つのプロセスのみが特定のローカルUDPポートを使用できますがSO_REUSEADDRESS、これnetcatは実装されていないようです。

他のポスターが示唆しているように、解決策は単一のプロセスを使用することにあります。

于 2012-07-10T00:00:45.693 に答える
2

そのような方法で netcat を使用できるとは思えません。1 つのプロセスで送信タスクと受信タスクの両方を実行する単純な Python スクリプトを作成することをお勧めします。そうすれば、そのポートを排他的に保持しながら、両方のタスクを実行できます。

于 2012-07-09T23:11:34.447 に答える