Подтвердить что ты не робот

Как вы дросселируете пропускную способность соединения сокета в C?

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

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

4b9b3361

Ответ 1

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

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

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

Тогда...

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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