Как отправить пакеты UDP с указанной скоростью в C ++ в Windows? - PullRequest
2 голосов
/ 21 февраля 2011

Я пишу программу, которая реализует сетевой тест RFC 2544.Как часть теста, я должен отправить UDP-пакеты с указанной скоростью.

Например, мне следует отправлять 64-байтовые пакеты со скоростью 1 Гбит / с.Это означает, что я должен отправлять UDP-пакет каждые 0,5 микросекунды.Псевдокод может выглядеть как " Отправка пакетов UDP с указанной скоростью ":

while (true) {
    some_sleep (0.5);
    Send_UDP();
}

Но я боюсь, что в Windows и в Linux тоже нет функции some_sleep(), котораядайте мне разрешение 0,5 микросекунды.

Возможно ли выполнить эту задачу в C ++, и если да, то как правильно это сделать?

Ответы [ 5 ]

2 голосов
/ 21 февраля 2011

Два подхода:

  • Создайте свой собственный сон с помощью зацикливания с использованием таймера высокого разрешения, такого как Windows QueryPerformanceCounter

  • Разрешить незначительные изменения в скорости, вставьте Sleep (1), когда вы достаточно опережаете расчетную скорость. Используйте timeBeginPeriod для получения разрешения 1 мс.

Для обоих подходов нельзя полагаться на точность сна. Вам нужно будет вести счетчики итогов и корректировать период сна по мере продвижения вперед / назад.

1 голос
/ 21 февраля 2011

Чтобы передавать 64-байтовые кадры Ethernet со скоростью линии, вы действительно хотите отправлять каждые 672 нс. Я думаю, что единственный способ сделать это - по-настоящему подружиться с оборудованием. Вы будете работать против ограничений полосы пропускания с шиной PCI и т. Д. Системные вызовы для отправки одного пакета будут значительно дольше, чем 672 нс. Функция сна - это наименьшее из ваших беспокойств.

1 голос
/ 21 февраля 2011

Это может быть полезно, но я сомневаюсь, что оно напрямую переносимо на все, кроме Windows. Реализация постоянно обновляющегося провайдера времени с высоким разрешением для Windows . Автор Johan Nilsson.

Однако имейте в виду, что для небольших пакетов накладные расходы IP и UDP будут учитыватьсябольшая часть фактических данных по проводам.Это может быть то, что вы хотели или нет.Очень быстрое сканирование RFC 2544 позволяет предположить, что допускаются пакеты гораздо большего размера;Возможно, вам лучше пойти по этому пути.Последовательная задержка всего на 0,5 микросекунды между Send_UDP() вызовами будет в лучшем случае трудной.

0 голосов
/ 21 февраля 2011

Вот нативная реализация Windows nanosleep.Если GPL приемлем, вы можете повторно использовать код, иначе вам придется переопределить.

0 голосов
/ 21 февраля 2011

Вы предполагаете, что сможете сделать это с помощью функции таймера Boost Asio s. Я сам не пробовал, но думаю, что deadline_timer потребует boost::posix_time::nanosec, а также boost::posix_time::second

Посмотрите пример здесь

...