Unix ソケット (O_NONBLOCK なし) を使用するクラス用のチャット クライアント サーバーを作成し、非同期 I/O を選択する必要があります。現時点では、サーバー上で、クライアントから 1024 バイトを読み取り、直接処理しています。
たとえば、メッセージの場合、MSG <msg>
(メッセージを送信するクライアントを表す) の形式のコマンドを受け取ります。接続されているクライアントのすべてのソケットを調べて、それらにメッセージを書き込みます。
send
このアプローチは実際には機能しますが、ソケットバッファーがいっぱいで、フラグ O_NONBLOCK がソケットに設定されていない場合にブロックできることを最近読んでわかりました。
この問題は、クライアントが何らかの理由 (クラッシュ、バグなど) で読み取れない場合に発生する可能性があると思います。これは、このクライアントが再度読み取るまで基本的にブロックされるため、サーバーにとって重要です。
だからここに私の質問があります:
ソケットバッファがいっぱいの場合にブロックへの送信を避けるために、潜在的にブロックしているソケットの正しいアプローチは何ですか?
私は現在、ソケットで読み取るものがあるかどうかを確認するためだけに選択を使用していますが、特定のソケットにも書き込むことができるかどうかを確認するためにも使用する必要がありますか? また、選択が返されたときに読み書きできるバイト数を知ることはできますか? たとえば、このソケットに書き込むことができることを select が「伝える」場合、このソケットへの書き込みが実際にブロックされる前に、最大で何バイト書き込むことができるかをどのように知ることができますか?
ありがとう。