Здравствуйте!Есть Select Socket Server на С++, к ниму подключаются клиенты.
Каждому клиенту пристаивается номер файлового дискриптора ID.
В линюксе у меня предел 1024. Удалось изменить эту цифру в самом сервере так:#define FD_LIMIT = 2000
...
struct rlimit limit;
limit.rlim_max=FD_LIMIT;
limit.rlim_cur=FD_LIMIT;
if(setrlimit(RLIMIT_NOFILE, &limit)==-1) log("Error: unable to set limits\n");
проверял .. новые ID подключаются до 2000..но как только достигается лимит 1024 и превышается возникают проблемы:
Все последующие подключения, даже с меньшими ID (если кто то дисконектился), после получения доли иформации отрубаются, а также сервер неполучает сигнала если клиент дисконектится..
Такое ощущение что сервер сам отправляет клиенту сигнал о завершении соединения.. а также неможет получить этот сигнал от клиента если клиент дисконнектит!Может кто то встречался с этим? Посоветуйте что нибудь, может нужно что то ещё сделать? или другим способом увеличить число FD.
Я не уверен на все 100, но если ты отслеживаешь изменения статуса сокета через select(), то данную проблему можно решить либо перекомпилированием ядра, либо использованием функции poll() вместо select().
Полезно наверное почитать этот обзор: http://www.opennet.me/base/dev/socket_method.txt.html
>Я не уверен на все 100, но если ты отслеживаешь изменения статуса
>сокета через select(), то данную проблему можно решить либо перекомпилированием ядра,
>либо использованием функции poll() вместо select().
>Полезно наверное почитать этот обзор: http://www.opennet.me/base/dev/socket_method.txt.htmlЭту статейку уже читал.
Всё же с селектом я давно знаком и нехочется его менять)
Получается что ограничение на уровне ядра, нельзя отследить состояние сокетов?
У меня Suse9, как бы узнать, действительно ли там ограничение на уровне ядра.. и в каких системах его можно увеличить програмно..
>[оверквотинг удален]
>
>но как только достигается лимит 1024 и превышается возникают проблемы:
>Все последующие подключения, даже с меньшими ID (если кто то дисконектился), после
>получения доли иформации отрубаются, а также сервер неполучает сигнала если клиент
>дисконектится..
>Такое ощущение что сервер сам отправляет клиенту сигнал о завершении соединения.. а
>также неможет получить этот сигнал от клиента если клиент дисконнектит!
>
>Может кто то встречался с этим? Посоветуйте что нибудь, может нужно что
>то ещё сделать? или другим способом увеличить число FD.Используй функции setrlimit & getrlimit.
Для получения информации в программе о лимитах и установки лимитов.
>[оверквотинг удален]
>>получения доли иформации отрубаются, а также сервер неполучает сигнала если клиент
>>дисконектится..
>>Такое ощущение что сервер сам отправляет клиенту сигнал о завершении соединения.. а
>>также неможет получить этот сигнал от клиента если клиент дисконнектит!
>>
>>Может кто то встречался с этим? Посоветуйте что нибудь, может нужно что
>>то ещё сделать? или другим способом увеличить число FD.
>
>Используй функции setrlimit & getrlimit.
>Для получения информации в программе о лимитах и установки лимитов.Именно так я и повышал лимит, но этот лимит ещё указан и в библиотеках select() для FD_SETSIZE.
Т.е. сокеты то подключаются а вот таблицы FD_SET неработают как только размер в 1024 превышен )
setrlimit & getrlimit будут нормально работают для файлов, но не для сокетов Select()Посидев ночку с добрым гуглом нашёл один выход:
1. /usr/include/bits/typesizes.h (прописывыем FD_SETSIZE 2048 и компилируем скрипт заного)
2. ulimit -n 2048 (выполнить перед запуском программы, что сразу более правильно устанавливает FD_LIMIT)Вечером сделаю тест, должно сработать, думаю многим пришодится эта инфа)
Если непоможет, буду копать дальше.
А по поводу статейки в которой написанно что select() ограничен на уровне кернеля (max_files), походу ошибочка. Лимит этот меняется на любой, по дефолму у меня вообще 10 000 =)))
>А по поводу статейки в которой написанно что select() ограничен на уровне
>кернеля (max_files), походу ошибочка.Не ошибочка, а учет всевозможных ядер. Если оно работает у вас, кто сказал что оно будет работать на каком-нибудь HP-UX или QNX?
>>А по поводу статейки в которой написанно что select() ограничен на уровне
>>кернеля (max_files), походу ошибочка.
>
>Не ошибочка, а учет всевозможных ядер. Если оно работает у вас, кто
>сказал что оно будет работать на каком-нибудь HP-UX или QNX?Ну можно в принципе подправить исходники ядра и пересобрать
>
>Ну можно в принципе подправить исходники ядра и пересобратьИменно об этом и написано в статье.