Блокирующий и неблокирующий сокет UDP для одного хоста - PullRequest
0 голосов
/ 10 июня 2011

Я пишу клиент, который получает UDP-дейтаграммы от одного отправителя. Все операции ввода-вывода будут выполняться в одном потоке. Обычно данных либо не будет, либо поток 30 Мбит / с. Моя главная задача заключается в том, чтобы задержка была как можно ниже.

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

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

Учитывая, что я работаю только с одним сокетом, кажется, что неблокирующий подход излишне сложен. Я что-то упустил? Есть ли причина предпочитать неблокирующие сокеты в этом конкретном случае?

Ответы [ 2 ]

8 голосов
/ 11 июня 2011

Если у вас есть выделенный поток для обработки сокета, то асинхронный ввод-вывод, select и т. Д. Бесполезны. Вам нужно просто recvfrom(2) и обрабатывать данные как можно быстрее.

Любые причудливые механизмы (epoll, libaio и т. Д.) Не помогут вам ускорить работу приложения.

2 голосов
/ 11 июня 2011

Имея всего несколько пиров (и 'one', безусловно, в этом наборе :), поток с блокирующим сокетом должен быть в порядке.Код легче писать, так как состояние может поддерживаться в выделенном потоке - нет необходимости в конечных автоматах, которые обычно требуются с неблокирующей системой.

Короткое время ожидания - вам это нужно?Вы закрываете эту подсистему перед закрытием приложения?Если нет, можете ли вы просто позволить ему быть убитым ОС?

Если вам нужно выключить систему потоков, вы можете установить некоторый флаг 'terminate' и отправить себе UDP-сообщение, чтобы разблокировать поток, чтобы он реализовалон должен умереть.

Ргдс, Мартин

...