10 (またはそれ以上) の異なるクライアントからの接続を受け入れることができるサーバー プログラムがあるとします。クライアントはランダムにデータを送信し、サーバーが受信しますが、更新ごとに少なくとも 1 つのクライアントがデータを送信することは確実です。サーバーは、他の処理を行う必要があるため、情報の到着を待つことができません。非同期ソケットを使用する以外に、次の 2 つのオプションがあります。
すべてのソケットをノンブロッキングにします。ループ内
recv()
で各ソケットを呼び出し、WSAEWOULDBLOCK
利用可能なデータがない場合は失敗させ、たまたまデータを取得した場合はそれを保持します。ソケットはブロッキングのままにします。すべてのソケットを に追加し、
FD_SET
を呼び出しますselect()
。戻り値が 0 以外の場合 (ほとんどの場合)、すべてのソケットをループして、適切な数の読み取り可能なソケットを見つけ、読み取り可能なソケットFD_ISSET()
のみを呼び出しますrecv()
。
最初のオプションは、関数へのより多くの呼び出しを作成しrecv()
ます。FD_SET
2 番目の方法は、すべてのandFD_ISSET
ループが原因で、プログラミングの観点からはより大きな問題になります。
どの方法 (または別の方法) が優先されますか? recv()
呼び出しの面倒な価値があるノンブロッキングソケットで失敗することによるオーバーヘッドを回避していますselect()
か?
私は両方の方法を理解しており、両方を試して成功したと思いますが、一方の方法がより良いまたは最適であると見なされるかどうかはわかりません。