Ну, так как этот ответ действительно общий, вот простой подход для простого TCP:
Вы помещаете обработчики ресурсов всех подключений для загрузки в список, в паре с информацией о том, какие данные запрашиваются, и просматриваете их. Затем вы записываете часть необходимых данных в сокет, возможно, около 1,5 Кб, что, насколько я знаю, является наиболее часто используемым максимальным размером сегмента. Когда вы на и в списке, вы начинаете все сначала. Прежде чем начать сначала, просто подождите, чтобы получить желаемую среднюю пропускную способность.
Обратите внимание: если слишком много клиентов имеют пропускную способность ниже, чем вы разрешаете, то ваш TCP-буфер, вероятно, взорвется. некоторые привязки TCP позволяют определить размер буферизованных данных для одного сокета. если он превышает пороговое значение, вы можете просто пропустить сокет.
Кроме того, если подключено слишком много клиентов, у вас фактически не будет достаточно времени для записи во все сокеты, поэтому после одного цикла вам «придется ждать отрицательного времени». Увеличение размера чанка может ускорить процесс в таких сценариях, но в какой-то момент ваш сервер перестанет работать быстрее.
Более простой подход заключается в том, чтобы сделать это на стороне клиента, но это может привести к большим накладным расходам. Идея простейшего состоит в том, чтобы запрос клиента составлял 1 КБ каждые 50 мс (при условии, что вы хотите 20 КБ / с). Вы можете даже сделать это через HTTP, хотя я настоятельно рекомендую больший размер чанка, поскольку HTTP имеет огромные накладные расходы.
Полагаю, лучше всего попытаться найти веб-сервер, способный делать такие вещи из коробки. Я думаю, что у Apache есть несколько модулей для всех видов квот.
Greetz
back2dos