Планирование повторной передачи пакета - PullRequest
3 голосов
/ 04 января 2011

Я программирую сетевой протокол по UDP, используя C / C ++ в Linux.Протокол должен обеспечивать надежность, поэтому я собираюсь смоделировать что-то вроде повторной передачи TCP через UDP.

Это можно сделать с помощью pthreads или fork , но я считаюэто излишнее и потребляет много системных ресурсов.Лучше всего использовать планировщик .

Я, вероятно, не могу использовать внутренний планировщик Linux, так как я программирую в пространстве пользователя.Существуют ли стандартные библиотеки C / C ++ для этого?Как насчет сторонних библиотек?

Редактировать: Некоторые люди спрашивали, почему я это делаю.Почему бы не использовать TCP вместо этого?

Ответ таков, поскольку я реализую протокол туннелирования.Если кто-то туннелирует TCP через TCP, эффективность значительно снизится.Вот дополнительная информация Почему TCP через TCP - плохая идея .

Ответы [ 3 ]

5 голосов
/ 04 января 2011

«Планировщик», который вам нужен, называется «select», и это вызов из пространства пользователя, доступный в linux. Введите «man 2 select», чтобы прочитать страницу справки о том, как ее использовать.

Если вам нужен тайм-аут, просто вызовите select () со значением тайм-аута. Вызов select будет возвращен либо после поступления новых данных, либо по истечении времени ожидания. Затем вы можете выполнить повторную передачу, если истекло время ожидания.

1 голос
/ 04 января 2011

Не ясно, что именно вы пытаетесь запланировать. Вы можете использовать libevent для эффективного и несколько портативного интерфейса. Это в основном похоже на предложение Мэтью использовать select, но использовать наиболее эффективный интерфейс (которого нет в select) в FreeBSD, Linux и MacOS X (на самом деле их страница теперь заявляет о поддержке Windows, но я не слишком знаком с этим) , Это даст возможность делать неблокирующие управляемые событиями сетевые вызовы. Это не решит часть планирования. Выполнение этого в отдельном потоке не повредит вашей производительности. Я думаю, что запуск pthread для каждого соединения - не лучший подход, но наличие одного потока планирования и нескольких рабочих потоков, работающих с сетевыми событиями, и, возможно, некоторая нетривиальная обработка обычно работает хорошо.

1 голос
/ 04 января 2011

Вот пример того, как выполнить асинхронные сопрограммы с Boost . В этом случае Boost управляет издержками на создание потока для запуска сопрограммы, так что вам это не нужно. Если вы хотите, чтобы ядро ​​управляло вашими прерываниями, вы можете использовать alarm & setitimer , но они очень ограничены в своих возможностях.

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

...