テスト中のコードがあります。プログラムAは、事前定義されたソケットでプログラムBが接続されるのを待ち、テスト用にプログラムAとBの32のインスタンスを実行します。私はプログラムAにポート9001-9032をリッスンし、接続するポートと一緒にプログラムBの各インスタンスの設定ファイルを入力するように指示するスクリプトを作成しました。
プログラムAとBを起動するスクリプトを実行したとき、netstat -tnap
すべてのポート9001-9032の中で実際に使用された唯一のポートは、他のプログラムで使用されていた9001であることがわかりました(私の間違いです!)。プログラムAをgrepするとき、各インスタンスがリッスンする必要があるポート90**とは無関係に完全にランダムであるように見えるポートでリッスンしていることがわかりました。しかし、私のプログラムB(ポート9001-9032に接続する必要があります)は、Bが接続しようとしているポートでAが明確にリッスンしていない場合でも、プログラムAのすべてのインスタンスを見つけて接続できます。どのようにこれが可能なのか混乱しています。
それが十分に混乱していない場合、私の32のプログラムとただ番号32(リスニング9032)は、エラーのため起動時に終了します。ポートにバインドしようとしたときにアドレスが拒否されました。何が起こっているのかを確認するために、ポート15001-15032でリッスンするようにプログラムを変更してみましたが、まだ同じ動作が表示されます。すべてのプログラムが任意のポートでリッスンしているように見え、32プログラムは接続を確立できません。
私のポートがなぜこのように動作するのかを説明できる人はいますか?私はnetstatまたはLinuxポートの一部を間違って理解しましたか?
答え1
socat
壊れたと推定される接続をシミュレートするには、ランダムなバイトストリームを生成するコマンドラインツールを使用することをお勧めします。
次のコマンドを使用してポートを聞いてみてください。
socat - TCP-Listen:9001
ポート9001でリッスンするTCP接続の場合、または
socat - UDP-Listen:9001
UDP接続に使用されます。
netstat -p
(またはsockstat
)に設定されている接続が表示されていることを確認してくださいsocat
。その場合は、コードをさらに調査し、次の場所にソースコードに関する質問を投稿する必要があります。stackoverflow.com。
他にあれば教えてください!