システムのFD_SETSIZEマクロの値を増やしたい。 FD_SETSIZEを増やす方法はありますか?
標準では、_FD_SETSIZE
_を増やす方法はありません。一部のプログラムとライブラリ(libeventが思い浮かびます)は、_fd_set
_オブジェクトに追加のスペースを割り当て、_FD_SETSIZE
_より大きい値を_FD_*
_マクロに渡すことで、これを回避しようとしますが、これはa堅牢な実装は引数の境界チェックを実行し、範囲外の場合は中止する可能性があるため、非常に悪い考えです。
常に機能する代替ソリューションがあります(標準で必須ではありませんが)。単一の_fd_set
_オブジェクトの代わりに、必要な最大fdを保持するのに十分な大きさの配列を割り当て、次にFD_SET(fd%FD_SETSIZE, &fds_array[fd/FD_SETSIZE])
などを使用してセットにアクセスします。
世論調査に置き換える方が良い(そして簡単)でしょう。通常、poll()はselect()の単純な置き換えであり、FD_SETSIZEの1024によって制限されません...
fd_set fd_read;
int id = 42;
FD_ZERO(fd_read);
FD_SET(id, &fd_read);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
if (select(id + 1, &fd_read, NULL, NULL, &tv) != 1) {
// Error.
}
になる:
struct pollfd pfd_read;
int id = 42;
int timeout = 5000;
pfd_read.fd = id;
pfd_read.events = POLLIN;
if (poll(&pfd_read, 1, timeout) != 1) {
// Error
}
Pollfd構造にはpoll.hを含める必要があります。
書き込むだけでなく読み取る必要がある場合は、イベントフラグをPOLLIN |に設定します。投票。
実際にあります[〜#〜] [〜#〜]は、WindowsでFD_SETSIZEを増やす方法です。これはwinsock.hで定義されており、Microsoft自体によると、winsock.hをインクルードする前に定義するだけで増やすことができます。
http://support.Microsoft.com/kb/111855
私はいつもそれをやっていて、問題はありませんでした。私が使用した最大の値は、開発中のサーバーで約5000でした