Какой API Linux / Windows соответствует предельной скорости сети (загрузка / выгрузка)? - PullRequest
8 голосов
/ 03 ноября 2011

Я говорю об ограничении скорости в менеджерах загрузки. Например, в Internet Download Manager есть опция:

enter image description here

Как это ограничить скорость? Я имею в виду, есть ли какой-то Windows API для этого? Что если это приложение для Linux?

Ответы [ 4 ]

5 голосов
/ 03 ноября 2011

Существует несколько способов сделать это в Windows:

Само приложение может неявно ограничивать скорость загрузки, отслеживая собственный битрейт и спя между вызовами recv() или read() в сокете, какНужно.

Я подозреваю, что Internet Download Manager может устанавливать себя как локальный HTTP-прокси и настраивать браузеры для маршрутизации всех запросов через него.А затем использует собственный сетевой код для потоковой загрузки с соответствующей скоростью, используя простую технику, описанную выше.Посмотрите, есть ли для вашего браузера настроенный прокси-сервер http - это должно быть хорошим советом, если это именно то, что он делает.

Еще один способ - использовать поставщика многоуровневых служб Winsock или драйвер фильтра.Попробуйте набрать netsh winsock show catalog из командной строки (многие системные уже установлены).

А у Winsock есть старый QOS API , который может "формировать трафик" наконкретный сокет.(И если память служит, у нее даже есть некоторая поддержка системной политики, где она может быть настроена снаружи приложения).

2 голосов
/ 07 января 2013

Мне действительно нужно это для проекта, который я делаю в Linux. Я заметил, что передача имела возможность ограничивать скорость загрузки. Просматривая их исходный код, вы можете найти скручивание по всему этому.

С учетом вышесказанного libcurl кажется хорошим API для программ на C \ C ++. API выглядит не так плохо, как и документация.

см. CURLOPT_MAX_SEND_SPEED_LARGE и CURLOPT_MAX_RECV_SPEED_LARGE в:

man curl_easy_setopt(3)

и домашняя страница libcurl

1 голос
/ 04 ноября 2011

@ Селби указывает вам правильное направление. Я просто хочу уточнить:

Получатель действительно может контролировать скорость только при больших загрузках. Для действительно небольших загрузок медленный запуск TCP будет контролировать пропускную способность. Загрузка не совсем небольшого размера (до согласованного предела размера окна TCP) будет завершена настолько быстро, насколько позволяет подключение, поскольку управление потоком TCP зависит от ACK, и отправитель не будет ожидать ACK. Для загрузок среднего размера (вплоть до размера буфера сокета) ОС немедленно подтвердит пакет, они будут выполнены так быстро, как позволяет соединение, и приложение не будет контролировать. Только после заполнения буфера сокета приложение может задержать recv и вызвать обратное давление, ограничивающее скорость передачи. Решения внутри сетевого стека (QOS или драйвер фильтра) необходимы для более коротких передач.

Если протокол предоставляет способ попросить отправителя установить скорость передачи, это будет наиболее эффективным.

0 голосов
/ 04 ноября 2011

В Linux я понятия не имею, как это делается на самом деле, но вы всегда можете взглянуть на исходный код приложений, делающих это (например, wget с --limit-rate) или просто strace, чтобы понять вовлеченную систему вызовов.

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

В Linux системные вызовы poll и select могут ожидать некоторой задержки, пока не будет доступен ввод или вывод. А чтобы просто подождать, используйте usleep или nanosleep системные вызовы и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...