![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Добрый день,
Чем больше работаю с сокетами - тем больше убеждаюсь что я чего-то не понимаю конкретно ![]() функция select принимает параметр - структуру fd_set.
что это? нельзя проверять на события больше 64 сокетов? Это как-то ненормально, в МСДН написано что можно изменить значение FD_SETSIZE перед иклудом - делаю вывод что это нормально - но..на одном форуме прочел что это неправильно, можно найти другое решение, правда не сказано какое..делаю вывод - можно циклом пихать сокеты в fd_set под 64 штуки на итерацию и делать select, но если у меня блокирующий select? Пока первые 64 не выдадут события - на остальных серверу будет наплевать..хмммм, кто что скажет? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 1 Всего: 162 |
Покурил маны, нигде число 64 не увидел.
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
JackYF
В манах я тоже не увидел..это студия - код кроссплатформенный |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
так нету его под виндоуз. Мне нужно кроссплаторменно.. если я сделаю #define FD_SETSIZE 1000 перед инклудом это мне напомнят в судный день? Смертных грех или не очень? |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
это кому предназначалось? тому кто маны курил? ![]() 1. маны к мсдн отношения не имеют 2. я сказал что в мсдн нашел, в манах - нет Это сообщение отредактировал(а) azesmcar - 15.4.2009, 08:35 |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Как пишет Р. Стивенс, FD_SETSIZE для большинства юниксподобных систем равно 256.
Простое увеличение через дефайн Стивенс пишет - может не действовать - без перекомпиляции ядра. Он же пишет - что для кросплатформенности не стоит изменять это значение. |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Олег2005
Замечательно, добавил проблем на мою голову..а решение??? ![]() Добавлено через 2 минуты и 52 секунды Из МСДН
вот только я тоже прочел что
так что же делать? Изменять только под виндоуз? Не важно, 256 тоже маловато. ![]() |
||||
|
|||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
||||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
т.е. чем я себе эти проблемы создал? тем что программистом стал или что кроссплатформенный код надо писать? ![]()
а которое наименьшее?? мне нужна поддержка обработки ну как минимум 500 сокетов. |
||||
|
|||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Ясно что кроссом.... Для кросса только селект то и подходит - он и там и там есть. Но в винде есть более мощные модели сетевого I/O - а в никсах - увы. Или как-то изголяться с #ifdef windows #endif #ifdef unix #endif Других мыслей нет |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Олег2005
В принципе у меня неблокирующий сокет. Я могу циклом засовывать сокеты в селект по 64 штуки за раз. Как вариант эта методика имеет права на жизнь? Добавлено через 2 минуты и 19 секунд
В никсах есть poll как сказал MAKCim, но...как сказали вы - увы ![]()
![]() |
||||
|
|||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Это понятно
А вот тут я не особенно врубаюсь ![]() Засовывать вы имеет право - FD_SET'ом 64 сокета. И что это даст? Поясните свое предположение - алгоритм в двух словах...... Это сообщение отредактировал(а) Олег2005 - 15.4.2009, 22:49 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Олег2005
Засовываю 64 сокета. Вызываю селект. Есть события, обрабатываю, нет событий - засовываю еще 64, пока не кончатся. Таймаут на селект ставлю 0. |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
Если таймаут 0, то селект будет ждать пока на сокетах не произойдет события. Так что если нет событий, то другие ты вставить не сможешь. Если ставить маленький, но реальный, таймаут, то тоже возможны ситуации когда сокет с данными простаивает слишком долго из-за того что он оказался в конце твоей очереди. Может все-таки лучше использовать другие механизмы, для которых нет ограничения на количество сокетов. А для кросс-платформености использовать готовые обертки типа boost.asio или ACE или самому написать такую обертку. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
в linux, ребята, есть epoll, а это реально мощная штука
![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
где такое написано? селект блокируется если передать 0 вместо timeout а не если передать структуру с таймаутом 0. МСДН
Так я и пишу обертку. а как ее писать то? MAKCim Вы видимо темой ошиблись ![]() http://forum.vingrad.ru/forum/topic-248292.html Я прекрасно знаю что линукс мощная штука...проблема в кроссплатформенности ![]() Это сообщение отредактировал(а) azesmcar - 16.4.2009, 11:41 |
||||||
|
|||||||
vinick |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
Извиняюсь. я почему-то решил что передаешь именно нулевой указатель.
По другому наверно никак. |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Ну пока я ничего не передаю ![]() vinick про "I/O completion ports" если можно подробнее... кстати, а в БСД что, нет poll, epoll? |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
я про них знаю только название и то что они являются аналогом epoll в линуксе ![]() poll скорее всего есть - это тот же select только в профиль. а вот epoll это чисто линуксовая штучка, ее аналогом в BSD является kqueue. Подробнее по *nix-вым механизмам можешь посмотреть здесь The 10k problem |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
В лоб - но работать будет ![]() Про IO completion port я уже где-то выкладывал - лень искать, выложу еще раз: Присоединённый файл ( Кол-во скачиваний: 21 ) ![]() |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Работать то будет..но хотелось бы чтобы работало хорошо ![]()
спасибо, посмотрел..так тут разница с линуксом огромная, практически нужно разные классы писать под виндоуз и под линукс..надо подумать что предпочтительней.. Это сообщение отредактировал(а) azesmcar - 16.4.2009, 13:21 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Еще одна мысль.
Поскольку сокеты все неблокирующие (так как в этом потоке мне нужно проверять и другие события, не только на сокетах), можно убрать селект вообще. Подробнее... На данный момент (если забыть про проблему селекта) у меня работает такая схема при каждой проверке события
в случае если убрать селект и проверять события функцией recv на каждом сокете по отдельности, одной итерацией по сокетам будет меньше..что вы об этом думаете? |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
recv как ни крути - системный вызов. Пробежаться по массиву и проверить событие в fd_set в юзерспейсе при большом количестве дескрипторов, будет дешевле чем впустую дергать recv для каждого сокета. Тут лучше будет экономить не на итерациях по сокетам, а на системных вызовах. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
vinick
а точно что будет медленее? подумать не стоит? |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Согласен. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
![]() ![]() ![]() ладно...буду думать. всем спасибо, решенным пока не отмечаю, мало ли.. |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
azesmcar, как я понял ты используешь С++, тогда я порекомендую использовать готовую библиотеку Asio C++ library Она проста в использовании, кроссплатформенна, подерживает не только windows и Linux но и Solaris, MacOSX и т.п., состоит только из *.h фалов, Она включена в состав буста, но может быть использована и отдельно. В крайнем случае ты можешь посмотреть на ее внутрености и попробовать реализовать свое по образу и подобию, выкинув лишнее, там правда очень много шаблонной магии. Короче то что надо ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
vinick
С++ конечно ![]() ![]() У меня своя кроссплатформенная библиотека, с обработкой событий (делегаты, итд, итп...) потому пишу свой класс, чтобы встраивался под общую архитектуру и выдавал события в нужном мне виде...у меня болезненный принцип не использовать ничего написанного сторонними производителями (после работы в одной компании остался осадок ![]() ![]() Завтра скачаю посмотрю - отпишусь..сегодня уже не успеть.. Спасибо Это сообщение отредактировал(а) azesmcar - 16.4.2009, 16:27 |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
ошибся темой? ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
MAKCim
![]()
Под линукс можно много чего красивого сделать..но нужно кроссплатформенно. |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
boost.Asio - pools, queues, IO completion ports
|
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
внимательно почитайте Overview - Core Concepts and Functionality и ознакомьтесь с паттерном "реактор" |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |