Как вы регулируете пропускную способность сокет соединения в C? - PullRequest
21 голосов
/ 25 октября 2008

Я пишу клиент-серверное приложение с использованием сокетов BSD. Он должен работать в фоновом режиме, непрерывно передавая данные, но не может увеличить пропускную способность сетевого интерфейса при обычном использовании. В зависимости от скорости интерфейса мне нужно регулировать это соединение до определенной максимальной скорости передачи.

Каков наилучший способ достичь этого программно?

Ответы [ 3 ]

17 голосов
/ 25 октября 2008

Проблема со сном в течение 1 секунды после каждой передачи состоит в том, что у вас будет нестабильная производительность сети.

Пусть BandwidthMaxThreshold будет желаемым порогом пропускной способности.

Пусть TransferRate будет текущей скоростью передачи соединения.

Тогда ...

Если вы обнаружите свой TransferRate> BandwidthMaxThreshold, тогда вы сделаете SleepTime = 1 + SleepTime * 1.02 (увеличьте время сна на 2%)

До или после каждой сетевой операции выполните Sleep (сон)

Если вы обнаружите, что ваша TransferRate намного ниже вашего BandwidthMaxThreshold, вы можете уменьшить SleepTime. В качестве альтернативы вы можете просто затухать / уменьшать ваш SleepTime с течением времени всегда. В конце концов ваш SleepTime снова достигнет 0.

Вместо увеличения на 2% вы также можете увеличить линейное увеличение разницы между TransferRate - BandwidthMaxThreshold.

Это решение хорошо, потому что вы не будете спать, если сеть пользователя уже не так высока, как хотелось бы.

12 голосов
/ 25 октября 2008

Лучший способ - использовать корзину токенов .

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

Чтобы контролировать размер пакетов, ограничьте максимальное количество токенов, которое вы можете иметь; хорошее количество может быть токеном на одну секунду.

7 голосов
/ 25 октября 2008

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

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

Обновление в 2017 году: похоже, что ручеек переместился на https://github.com/mariusae/trickle

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