Как контролировать пропускную способность сокета UDP?

Чего я хочу добиться, так это вывода данных через сокет со стабильной скоростью, например 600 КБ/с. Поскольку TCP имеет собственное управление потоком, я выбираю UDP.

Вот и возникает вопрос: как этого добиться? Могу ли я просто отправить один пакет размером 600 КБ в минуту? А как контролировать временной интервал между двумя пакетами? Могу ли я просто установить временной интервал с помощью select():

select(fd, NULL, NULL, NULL, &tv); //tv is set as 1 second

Я сомневаюсь в этом, потому что sendto() сокета выполняется на уровне приложения, и мы не может гарантировать, что пакет был отправлен ядром ОС.

Как это решить? Или есть лучший способ?

PS:Язык C


person simon_xia    schedule 09.12.2014    source источник
comment
Предлагаемое вами сообщение размером 600 КБ будет разбито ОС на более чем 600 пакетов. Кроме того, если под контролем потока вы подразумеваете скорость, то TCP не имеет управления потоком... TCP гарантирует 1) проверку содержимого пакетов на наличие ошибок 2) пакеты доставляются пиру в правильном порядке 3) повторную передачу потерянных пакетов. Вы не получите ничего из этого с UDP. Если эти проблемы важны для вас, вам придется либо использовать TCP, либо встроить их в свое приложение (т. е. также известное как изобретение велосипеда).   -  person TonyB    schedule 09.12.2014


Ответы (1)


Самый простой подход — просто подождать между отправками достаточно долго, чтобы снизить общую пропускную способность. Это снизит «среднюю» скорость отправки до желаемого значения.

Однако гораздо лучшая реализация заключается в том, чтобы получатель отправлял ACK после получения ввода. Таким образом, стимуляция с наилучшей доступной скоростью. Конечно, тогда должны быть таймауты и повторные отправки и т.д.

person user3629249    schedule 09.12.2014