Один общий случай формирования одного TCP-соединения может быть фактически собран из двух пар socat
и cpipe
в UNIX-моде, например так:
socat TCP-LISTEN:5555,reuseaddr,reuseport,fork SYSTEM:'cpipe -ngr -b 1 -s 10 | socat - "TCP:localhost:5000" | cpipe -ngr -b 1 -s 300'
Это моделирует соединение с пропускной способностью около 300Кб / с от вашей службы в :5000
и до приблизительно 10 килобайт / с и прослушивает :5555
входящие соединения. Предупреждение : обратите внимание, что это для каждого соединения , поэтому каждое отдельное TCP-соединение получает эту сумму.
Объяснение: Внешний (слева) socat
прослушивает с заданными параметрами :5555
в качестве разветвляющегося сервера. Затем первая cpipe
команда в SYSTEM:...
параметре регулирует данные, которые поступают в сокет: 5555 (и выходит из первого, внешнего socat
) до максимум 10 КБ / с. Затем эти данные пересылаются с помощью другого, socat
который подключается localhost:5000
(где служба, которую вы хотите замедлить, должна прослушивать). Данные из localhost:5000
затем помещаются в правильную cpipe
команду, которая (с заданными значениями) дросселирует ее до 300 кБ / с.
Опция -ngr
для cpipe
очень важна. Это заставляет cpipe читать жадно из своего входного файла-дескриптора. В противном случае вы можете застрять в буферах данных, которые не будут перенаправлены и ожидают ответа.
Использование более распространенного buffer
инструмента вместо cpipe
вероятного также возможно.
(Авторы: это основано на рецепте "двойного тройника" Кристофа Лора из socat
документации)