2
私はクライアントサーバーアプリケーションを開発しています。 同じクライアントを複数回実行すると、サーバーは1つのサーバーからのみデータを受信し、他のサーバーはデータをブロックします。 ここで私の質問は、単一のクライアントから同じポートで複数の接続を行うことは有効ですか?同じクライアントが複数のサーバーに接続できますか?
私はクライアントサーバーアプリケーションを開発しています。 同じクライアントを複数回実行すると、サーバーは1つのサーバーからのみデータを受信し、他のサーバーはデータをブロックします。 ここで私の質問は、単一のクライアントから同じポートで複数の接続を行うことは有効ですか?同じクライアントが複数のサーバーに接続できますか?
はい、できます。それはすべてサーバー側のコードがどのように記述されるかによって異なります。 accept()でクライアント接続を受け入れた後に別のプロセスをfork()したり、accept()によって返されたすべてのソケット記述子を保存したり、select()ですべてのソケット記述子を処理することができます。
したがって、同じクライアントから同じポートに複数の接続を行うことは有効です。クライアントは異なるソースポートを使用するので、4タプル(src_ip、src_port、dst_ip、dst_port)は一意に保たれます。
私はクライアントごとに受け入れた後に新しいスレッドを作成しています。私は同じマシンから複数のクライアントを実行する場合、サーバーは各クライアントのスレッドを作成します。しかし、サーバーは最新の作成されたクライアントのみからデータを受け取ります。私はすべてのクライアントが同じソケット番号を共有していることを知りました。 – Nipun
いいえ、accept()からそれぞれの戻り値が新しいソケットファイル記述子を与えるはずです。 – jman
Acceptはサーバー側で呼び出され、サーバーは別のソケットを取得しますが、すべてのクライアントは同じソケット番号を取得しています。これは予期しない動作であると思います。 – Nipun