выбрать () макс розетки - PullRequest
5 голосов
/ 18 марта 2011

Просто больше асинхронных вещей!

Хорошо, теперь у меня есть рабочая программа для асинхронных сокетов для моего основного приложения для чата, и она работает очень хорошо! Однако у меня есть одна проблема ..

При использовании select (), какое максимальное количество файловых дескрипторов я могу использовать в каждом наборе? Я читал о пределе 1024 ...

Если этот лимит действительно жестко запрограммирован, и я не могу FD_SETSIZE лимит больше, я должен порождать другой поток, как только я достигну этого предела? Или что-то другое? Это даже беспокойство?

Ответы [ 4 ]

9 голосов
/ 18 марта 2011

Да, FD_SETSIZE имеет ограничение 1024. Вы можете легко проверить это, посмотрев на заголовок select.h.Люди пытались увеличить лимит, но через некоторое время отчеты меняются от «работающих» до «сбоев».Если вам нужно столько подключений, используйте poll.

Очень хорошая статья для чтения.

3 голосов
/ 18 марта 2011

Для действительно большого количества сокетов изучите использование библиотеки типа libevent.

Библиотека может абстрагировать некоторые специфичные для ОС дополнительные функции, такие как / dev / poll, kqueue, epoll и порты событий. С ними вы можете справиться с огромным количеством соединений.

3 голосов
/ 18 марта 2011

Если вы программируете в системе, совместимой с Posix, вы должны иметь возможность использовать функцию poll () вместо select (), и это устранит указанное вами ограничение. Кроме того, вы можете вызывать select () несколько раз подряд, но обязательно используйте относительно короткий тайм-аут.

1 голос
/ 18 марта 2011

Вы не говорите, какую операционную систему вы используете, но для большинства, если вы хотите использовать дескрипторы файлов выше 1024 с select, вы можете #define FD_SETSIZE быть большим числом ДО #inclusive sys / socket.h. К сожалению, это не работает в Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...