Один общий случай формирования одного 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документации)