Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> select fd_set максимальный размер 
:(
    Опции темы
vinick
Дата 16.4.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(azesmcar @  15.4.2009,  23:35 Найти цитируемый пост)

Есть события, обрабатываю, нет событий - засовываю еще 64, пока не кончатся. Таймаут на селект ставлю 0. 
 

Если таймаут 0, то селект будет ждать пока на сокетах не произойдет события.  Так что если нет событий, то другие ты вставить не сможешь.
Если ставить маленький, но реальный, таймаут, то тоже возможны ситуации когда сокет с данными простаивает слишком долго из-за того что он оказался в конце твоей очереди.

Может все-таки лучше использовать другие механизмы, для которых нет ограничения на количество сокетов. А для кросс-платформености использовать готовые  обертки типа boost.asio или ACE или самому написать такую обертку.
PM MAIL ICQ Jabber   Вверх
MAKCim
Дата 16.4.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



в linux, ребята, есть epoll, а это реально мощная штука  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
azesmcar
Дата 16.4.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата

Если таймаут 0, то селект будет ждать пока на сокетах не произойдет события.  Так что если нет событий, то другие ты вставить не сможешь.

где такое написано? селект блокируется если передать 0 вместо timeout а не если передать структуру с таймаутом 0.

МСДН
Цитата

timeout 
Maximum time for select to wait, provided in the form of a TIMEVAL structure. Set the timeout parameter to null for blocking operations.


Цитата

Может все-таки лучше использовать другие механизмы, для которых нет ограничения на количество сокетов. А для кросс-платформености использовать готовые  обертки типа boost.asio или ACE или самому написать такую обертку.

Так я и пишу обертку. а как ее писать то?

MAKCim
Вы видимо темой ошиблись smile это надо было постить сюда
http://forum.vingrad.ru/forum/topic-248292.html

Я прекрасно знаю что линукс мощная штука...проблема в кроссплатформенности smile 

Это сообщение отредактировал(а) azesmcar - 16.4.2009, 11:41
PM   Вверх
vinick
Дата 16.4.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(azesmcar @  16.4.2009,  11:37 Найти цитируемый пост)
где такое написано? селект блокируется если передать 0 вместо timeout а не если передать структуру с таймаутом 0.

Извиняюсь. я почему-то решил что передаешь именно нулевой указатель.


Цитата(azesmcar @  16.4.2009,  11:37 Найти цитируемый пост)
Так я и пишу обертку. а как ее писать то?


Код

int SuperSelect(SOCKET* fds,...)
{
#ifdef WINDOWS
используем I/O completion ports
#endif
#ifdef  LINUX
используем epoll
#endif
#ifdef FREEBSD
используем kqueue
#endif

По другому наверно никак.
PM MAIL ICQ Jabber   Вверх
azesmcar
Дата 16.4.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата

Извиняюсь. я почему-то решил что передаешь именно нулевой указатель.

Ну пока я ничего не передаю smile я думаю что передать


vinick

про "I/O completion ports" если можно подробнее...
кстати, а в БСД что, нет poll, epoll?
PM   Вверх
vinick
Дата 16.4.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(azesmcar @  16.4.2009,  12:00 Найти цитируемый пост)

про "I/O completion ports" если можно подробнее...

я про них знаю только название и то что они являются аналогом epoll в линуксе smile так что лучше в MSDN загляни.

Цитата(azesmcar @  16.4.2009,  12:00 Найти цитируемый пост)
кстати, а в БСД что, нет poll, epoll? 

poll скорее всего есть - это тот же select только в профиль. а вот epoll это чисто линуксовая штучка, ее аналогом в BSD является kqueue.

Подробнее по *nix-вым механизмам можешь посмотреть здесь The 10k problem
PM MAIL ICQ Jabber   Вверх
Олег2005
Дата 16.4.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Цитата(azesmcar @  15.4.2009,  22:35 Найти цитируемый пост)
Засовываю 64 сокета. Вызываю селект. Есть события, обрабатываю, нет событий - засовываю еще 64, пока не кончатся. Таймаут на селект ставлю 0. 

В лоб - но работать будет smile 
Про IO completion port я уже где-то выкладывал - лень искать, выложу еще раз:

Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  IOCP.zip 51,81 Kb
PM MAIL WWW MSN   Вверх
azesmcar
Дата 16.4.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата

В лоб - но работать будет smile 

Работать то будет..но хотелось бы чтобы работало хорошо smile что плохого в этом решении?
Цитата

Про IO completion port я уже где-то выкладывал - лень искать, выложу еще раз: 

спасибо, посмотрел..так тут разница с линуксом огромная, практически нужно разные классы писать под виндоуз и под линукс..надо подумать что предпочтительней..

Это сообщение отредактировал(а) azesmcar - 16.4.2009, 13:21
PM   Вверх
azesmcar
Дата 16.4.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Еще одна мысль.
Поскольку сокеты все неблокирующие (так как в этом потоке мне нужно проверять и другие события, не только на сокетах), можно убрать селект вообще. Подробнее...
На данный момент (если забыть про проблему селекта) у меня работает такая схема при каждой проверке события

Код

итерация по всем сокетам
   добавление их в fd_set
запуск селекта
итерация по всем сокетам
   проверка - остался ли сокет в fd_set (т.е. есть ли событие)
      выдать событие обработчику


в случае если убрать селект и проверять события функцией recv на каждом сокете по отдельности, одной итерацией по сокетам будет меньше..что вы об этом думаете?


PM   Вверх
vinick
Дата 16.4.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(azesmcar @  16.4.2009,  13:51 Найти цитируемый пост)
в случае если убрать селект и проверять события функцией recv на каждом сокете по отдельности, одной итерацией по сокетам будет меньше..что вы об этом думаете?


recv как ни крути - системный вызов. Пробежаться по массиву и проверить событие в fd_set в юзерспейсе при большом количестве дескрипторов,  будет дешевле чем впустую дергать recv для каждого сокета. Тут лучше будет экономить не на итерациях по сокетам, а на системных вызовах.
PM MAIL ICQ Jabber   Вверх
azesmcar
Дата 16.4.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



vinick

Цитата

recv как ни крути - системный вызов. Пробежаться по массиву и проверить событие в fd_set в юзерспейсе при большом количестве дескрипторов,  будет дешевле чем впустую дергать recv для каждого сокета. Тут лучше будет экономить не на итерациях по сокетам, а на системных вызовах.

а точно что будет медленее? подумать не стоит?
PM   Вверх
Олег2005
Дата 16.4.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Цитата(vinick @  16.4.2009,  14:11 Найти цитируемый пост)
recv как ни крути - системный вызов. Пробежаться по массиву и проверить событие в fd_set в юзерспейсе при большом количестве дескрипторов,  будет дешевле чем впустую дергать recv для каждого сокета. Тут лучше будет экономить не на итерациях по сокетам, а на системных вызовах. 

Согласен.
PM MAIL WWW MSN   Вверх
azesmcar
Дата 16.4.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



 smile  smile  smile 

ладно...буду думать.

всем спасибо, решенным пока не отмечаю, мало ли..
PM   Вверх
vinick
Дата 16.4.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(azesmcar @  16.4.2009,  15:44 Найти цитируемый пост)
ладно...буду думать.


azesmcar,  как я понял ты используешь С++, тогда я порекомендую использовать готовую библиотеку  Asio C++ library

Она проста в использовании, кроссплатформенна, подерживает не только windows и Linux но и Solaris, MacOSX и т.п., состоит только из *.h фалов, Она включена в состав буста, но может быть использована и отдельно. 
В крайнем случае ты можешь посмотреть на ее внутрености и попробовать реализовать свое по образу и подобию, выкинув лишнее, там правда очень много шаблонной магии.
Короче то что надо  smile 
PM MAIL ICQ Jabber   Вверх
azesmcar
Дата 16.4.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



vinick
С++ конечно smile раздел форума С++/Сети называется smile 

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

Спасибо

Это сообщение отредактировал(а) azesmcar - 16.4.2009, 16:27
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0878 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.