送信と受信を同時に行う必要があります。
どちらのオプションが良いでしょう:
- 非ブロッキングソケットを使用した1つのスレッド処理の送信と受信
また
- 2つのスレッドと1つの処理ブロッキングrecv()+ 1つの処理send()?
または別の解決策はありますか?
最大で約50の双方向接続があると予想しています。その結果、オプション#1で50スレッド、オプション#2で100スレッドになります。
送信と受信を同時に行う必要があります。
どちらのオプションが良いでしょう:
また
または別の解決策はありますか?
最大で約50の双方向接続があると予想しています。その結果、オプション#1で50スレッド、オプション#2で100スレッドになります。
私はこれらのアプローチのどちらも使用しません。
このSOの質問を見てください。Nスレッドが非ブロッキングソケットですべてのトラフィックを処理するワーカースレッドモデルを使用します。
今説明したアプローチの1つに絶対に従う必要がある場合は、ノンブロッキングIMHOを使用してください。
ノンブロッキングソケットを使用する必要がありますが、手動でポーリングするのではなく、カーネルに自動的にポーリングさせる必要があります。poll
またはこれに使用select
します(一度により多くのソケットを処理できるため、前者が推奨されます)。これを行うと、オプション1で1つのスレッド、またはオプション2で2つのスレッドになります。:-P
1つのスレッドと2つの非ブロッキングソケットを使用し、select()を使用して、入力と出力キューのスペースを待機することができます。
次に、プロセッサ時間を使用せずにselect()がブロックするため、ポーリングする必要はありません。
パフォーマンスとスケーラビリティが気になる場合は、IOCP (async socket read/write) を試してください:スケーラブルな Tcp/Ip ベースのサーバーを作成する方法
「接続ごとのスレッド」よりもIOCPを実装する方がはるかにトリッキーであることに注意してください.50個の接続(またはあなたが提案するように100個のスレッド)しか持たないので、それは「十分」であり、正しく実装するのが簡単です。
単純なアプローチを試して測定してください...しかし、より高いパフォーマンスが必要な場合、または 50 接続を超えて (はるかに?) 拡張する予定がある場合は、より良いソリューションとして IOCP を真剣に検討してください。