LINUX.ORG.RU

select()/pselect()


0

2

select() и pselect() принимают указатели на структуру типа fd_set с которой можо работать последством макросов FD_ZERO, FD_SET, FD_ISSET . sizeof(fs_set) равен 128 байт, инфа о дексрипторах сокета там как я понимаю храниться в виде набора бит, правильно ли я понимаю что select() и pselect() не могут обслужить больше 128 сокетов за раз? получается они не увидят дескрипторы сокетов с номерами выше 128? ведь FD_SET просто не сможет установить в эту структуру дескриптор сокета с номером выше 128.

★★★★
Ответ на: комментарий от quest

Но это меняет ответ :-)

1024 - максимум для селекта. Можно использовать poll, но это тоже бессмысленно, потому что на большом количестве дескрипторов он будет тормозить. Поэтому есть epoll для таких случаев, но он чисто линуксовый. И вообще - http://www.kegel.com/c10k.html, если еще не читал.

vga ★★
()

действительно ulimit -n равен 1024

а как вы себе видите архитектуру мультиклиенского сервера исходя из этого?

1) наплодить потоков и при accept() передавать сокет потоку и он будет работать с ним делая select() на этот сокет

2) наплодить потоков, при accept() запоминать скажем в std::set дескриптор сокета, делать epoll() на std::set и передавать потокам дескрипторы сокетов чтобы они с ними работали

3) ?

quest ★★★★
() автор топика
Ответ на: комментарий от arsi

только вот RLIMIT_NOFILE к FD_SETSIZE имеет весьма опосредствованное отношение.
ограничение select() на число дескрипторов обходиться так
#define FD_SETSIZE 2048
#include <sys/types.h>

anonymous
()
Ответ на: комментарий от anonymous

#define FD_SETSIZE 2048

#include <sys/types.h>

проверяешь бдительность лоровцев, да? :)

или ты и вправду не знаешь, что в «sys/types.h» этот макрос определяется безусловно? ;)

arsi ★★★★★
()
Ответ на: комментарий от quest

>а как вы себе видите архитектуру мультиклиенского сервера исходя из этого?

первое. Будет обычный prefork сервер. Второе - полный бред, тебе же еще сокет нужно слушать на входящие соединения.

nu11 ★★★★★
()
Ответ на: комментарий от nu11

>первое. Будет обычный prefork сервер. Второе - полный бред, тебе же еще сокет нужно слушать на входящие соединения.

первый вариант я писал с пулом тредом с их засыпанием и просыпанием и тд, но всю дорогу пользовал select() думаю при такой архитектуре ведь без разницы select() в треде вызывается для одного сокета или epoll ?

сервер специализированный без запуска в себе сторонних програм как апач - поэтому вместо fork() с понижением привелегий - треды. входящих соединений тясячи в секунду - нужно их все эффективно разгребать...

quest ★★★★
() автор топика
Ответ на: комментарий от frey

просмотрел наискасок, можно вкратце что ты думаешь о вышеприведенных вариантах?

quest ★★★★
() автор топика

Простой способ обойти ограничение размера fs_set в 1024 дескрипрторов:

учиняете свой массив дескрипторов нужного размера, пихаете в fs_set сколько влезет, зовете select(), обрабатываете что в дескрипторах произошло, пихаете в fs_set следующуюю порцию своих дескрипторов, ...

imatveev13
()
Ответ на: комментарий от imatveev13

переоткрывая сокеты? ))))

quest ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.