3

私は C (Linux) で、2 つの異なるポート番号をリッスンする必要があるマルチスレッド サーバー アプリケーションを作成しています。たとえば、ポート番号 3000 と 4000 をリッスンし、それに接続するさまざまなクライアントが異なる機能を提供するようにします (実際の機能はワーカーによって実行されます)。スレッド、メイン スレッドは無期限に実行され、新しい接続時に新しいワーカーが生成されます)。複数のソケット接続を使用できますが、すべてが同じポート番号に関連付けられている可能性があるため、select がここで機能するかどうかはわかりません。sock_1 と sock_2 に順次バインドしてみました。client_1 を実行すると、すべてが期待どおりに機能します。しかし、client_2 を実行すると、クライアント側から connect() でエラーが発生します。ここで select() を使用できる場合は、その方法を教えてください。どんな助けでも大歓迎です!ありがとう !

(PS sock_1 はポート番号 3000 を指し、sock_2 はポート番号 4000 を指します。client_1 はポート 3000 からサービスを求めるクライアントを指し、client_2 はポート番号 4000 から同じサーバーからサービスを求めるクライアントを指します)

4

2 に答える 2

7

あなたは完全にソケットとポートを誤解しています、これら2つは異なるものです。ポートは複数のソケットを持つことができます。ただし、リストソケット(パッシブソケット)を単一のポートにのみバインドできます。先に進む前にこれを読んでください

アプリケーションが2つの異なるポートでリッスンするようにしたい場合は、2つの異なるソケットをバインドします。

クイックリファレンスの場合、単一プロセスでの選択には、最大1024個のソケット記述子しか含めることができません。したがって、単一のプロセスモデルを使用している場合、selectは1024接続しか処理できません。また、C10k問題を読んで、ニーズに合ったものを確認してください。

于 2012-10-05T07:12:50.557 に答える
3

select() の使用は、アプリケーションが一度に複数のソケットからデータを受け入れる必要がある場合に最適です。これは、多数のソケットのいずれかでデータの準備が整うまでブロックされるためです。select() のもう 1 つの利点は、タイムアウト値を設定できることです。その後、ソケットのいずれかにデータがあるかどうかに関係なく、制御が返されます。
次のリンクは役に立ちます:
http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html

質問-20
http://www.scribd.com/doc/7296598/Unix-Network-Programming-Volume-I-The-Sockets-Networking-API-3rd-Edition

第 6 章: あなたのアプリケーションが「select() を必要としない」と私が理解したこと 次のリンクでコードを見てください: -pthreads/

コード内の異なるポートに対して 2 つの異なる bind() を呼び出していますか? 彼の回答で@Rahul Gautamが指摘したように。

于 2012-10-05T06:36:58.300 に答える