イベント駆動型のネットワーク サーバー プログラムがあります。このプログラムは、他のホスト上の他のプロセスからの接続を受け入れます。同じリモート IP 上の異なるポートからの短時間の接続が多数ある可能性があります。
while(1)
現在、新しい接続を処理するためにスレッドを呼び出して生成するループがありますaccept()
。各接続は、メッセージが読み取られた後に閉じられます。リモート側では、メッセージが送信された後に接続が閉じられます。
オープンソケット FD をキャッシュすることで、接続の設定と切断のオーバーヘッドを排除したいと考えています。送信側では、これは簡単です。接続を閉じずにそのままにしておくだけです。
受信側では、少し難しくなります。 によって返されたFDをaccept()
構造体に格納し、poll()
またはを使用してそのようなソケット全体でメッセージをリッスンできることはわかっていますselect()
が、同時に新しい接続をリッスンしたいのです。accept()
そしてキャッシュされたすべての接続をリッスンします。
2 つのスレッド (poll()
と )を使用する場合、呼び出しが返される (新しい接続が開かれる)accept()
ときに、古い接続セットを待機しているもう 1 つのスレッドを起動する必要があります。シグナルと でこれを行うことができることはわかっていますが、この混乱は、非常に単純なことに対してあまりにも多くの作業のように思えます。accept()
pselect()
新しい接続の開設と古い接続でのデータの送信を同時に処理できる呼び出しまたはより優れた方法論はありますか?
ベストアンサー1
前回確認したときは、listen
ソケットをオンにして、select
またはpoll
接続が来たかどうかを確認できました。もしそうなら、accept
それはブロックされません(ただし
、
本当にそうすべき念のためO_NONBLOCKを設定してください)