1

ノンブロッキングソケット、タイムアウトの選択、読み取り(2) および書き込み(2)を使用して、いくつかのレガシー コードを取得しました。select/1024 fd の制限により、時々失敗するようになりました。だから私は選択を置き換える必要があります。

RCVTIMEO と SNDTIMEO もタイムアウトをチェックできるようですが、それらはブロッキングモードで機能し、非ブロッキングからブロッキングに変更するには影響が大きすぎます。

非ブロックソケットのタイムアウトをチェックするための他のベストプラクティスはありますか? または、これを解決するにはタイマー/ナノスリープを取得する必要がありますか?

4

3 に答える 3

4

poll()は本質的に using のドロップイン置換ですselect()が、1024 ファイル記述子の制限はありません。struct pollfdsを使用する代わりに、コードを少し変更して構造体の配列を作成するfd_set必要がありますが、コードの全体的な構造を変更する必要はありません。

于 2012-06-29T03:15:56.783 に答える
3

epoll は、1024 個の記述子に制限されていない select よりも優れたソリューションです。

実際、libeventまたはlibevを使用して低レベルの非同期ソケット I/O を処理できます。これらは非同期 I/O のいわゆる「ベスト プラクティス」です。

于 2012-06-29T03:21:29.333 に答える
2

poll() システム コールはタイムアウトを取り、ファイル記述子の固定制限はありません。ただし、実際に 1000 個のオープン記述子がある場合は、epoll() を使用したほうがよいでしょう。これは、使用がより複雑ですが、スケーリング特性がはるかに優れています。

于 2012-06-29T03:19:42.970 に答える