2009-11-26 3 views
0

Мне нужен быстрый метод для проверки сокета. Имеются данные для чтения. Я использую select(), но это не быстро. Быстро ли существует метод?Доступные данные для сокета для чтения

+0

Что не "быстро" об этом? Сколько времени требуется для вызова select(), таким образом, количество выбранных в секунду вы можете сделать. Или проблема в том, сколько общей обработки данных вы делаете. Определите значение/ожидание «быстрого» –

+0

Мне нужно проверить около 1000 сокетов за 1/10 секунды, может быть быстрее. Я проверил select() с 1000 гнездами. Каждый сокет посылает 4 байта каждые 10 секунд. 1000 сокетов обрабатывались 1 секунда. – 2009-11-26 22:13:49

ответ

2

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

API-интерфейс epoll() в Linux - это, пожалуй, мой любимый метод работы с несколькими сокетами. Вы можете быстро изучить его, но он недоступен в Windows.

Я считаю, что единственный способ ограничить ограничения select() в Windows с помощью этого множества сокетов - использовать порты ввода-вывода IO.

+0

Восстановить fd_set? Вы имеете в виду, что сам select() генерирует еще один fd_set с готовыми к чтению сокетами? – Spidey

+0

select() изменит любой переданный ему fd_set. Таким образом, при следующем вызове вы должны повторно создать fd_set для перехода к select() - либо через сокеты, либо путем копирования другого fd_set, оба из которых являются операциями O (n). Однако API, например epoll(), не нужно передавать набор FD - они их помнят, и вы уведомляете API об изменениях в вашем наборе FD. – Thanatos

0

Необходимо использовать порты завершения в Windows. Есть много онлайн-статей о том, как их использовать.