上記のシナリオでは、何らかの種類のロックが必要ですか?
なし。
上記のシナリオでは、非ブロッキング ソケットが必要ですか?
おそらく心配しているのは、確立された接続での読み取りスレッドと書き込みスレッドです。それらのスレッドが完了するのを待ってそこに座って満足している場合は、ノンブロッキングである必要はありません。これは通常、選択、ポーリング、または非同期操作ではなくスレッドを使用する理由の 1 つです... コードもシンプルに保ちます。
新しいクライアントを受け入れるスレッドが への呼び出しで喜んでブロックするaccept()
場合は、そこでも問題ありません。
それでも、TCP サーバーには、心に留めておきたい微妙な問題が 1 つあります... プログラムが成長して複数のクライアントを処理し、定期的なハウスキーピングを行う必要がある場合。select
タイムアウト付きのステートメントを使用して、リスニング ソケット (クライアント接続の試行を示し、次に接続) の可読性をチェックするのは自然で魅力的accept
です。そこには競合状態があります: クライアント接続の試行が と の間でドロップした可能性がselect()
ありaccept()
ますaccept()
。select()
クライアントが接続します。
上記のシナリオで役立つオープンソース ライブラリはありますか?
基本的なサーバーを作成するためのライブラリは何百もありますが、最終的には、OS が提供する BSD ソケットまたは Windows のろくでなし化の上で、あなたが求めていたものを簡単に実現できます。