web-dev-qa-db-ja.com

FD_SETSIZEの制限を増やして選択

システムのFD_SETSIZEマクロの値を増やしたい。 FD_SETSIZEを増やす方法はありますか?

18
Vivek Goel

標準では、_FD_SETSIZE_を増やす方法はありません。一部のプログラムとライブラリ(libeventが思い浮かびます)は、_fd_set_オブジェクトに追加のスペースを割り当て、_FD_SETSIZE_より大きい値を_FD_*_マクロに渡すことで、これを回避しようとしますが、これはa堅牢な実装は引数の境界チェックを実行し、範囲外の場合は中止する可能性があるため、非常に悪い考えです。

常に機能する代替ソリューションがあります(標準で必須ではありませんが)。単一の_fd_set_オブジェクトの代わりに、必要な最大fdを保持するのに十分な大きさの配列を割り当て、次にFD_SET(fd%FD_SETSIZE, &fds_array[fd/FD_SETSIZE])などを使用してセットにアクセスします。

13
R..

可能であればpollの使用もお勧めします。 libevent または libev (またはGTKの Glib のイベント機能、または QtCore など)これはあなたを助けるはずです。 epoll のようなものもあります。そして、あなたの問題は C10k に関連しています

13

世論調査に置き換える方が良い(そして簡単)でしょう。通常、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 |に設定します。投票。

8
Simon Gymer

実際にあります[〜#〜] [〜#〜]は、WindowsでFD_SETSIZEを増やす方法です。これはwinsock.hで定義されており、Microsoft自体によると、winsock.hをインクルードする前に定義するだけで増やすことができます。

http://support.Microsoft.com/kb/111855

私はいつもそれをやっていて、問題はありませんでした。私が使用した最大の値は、開発中のサーバーで約5000でした

2
BrierMay