Один поширений випадок формування єдиного 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
, можливо, також можливо.
(Подяки: Це засновано на рецепті "double-tee" Крістофа Лора з socat
документації)