Один поширений випадок формування єдиного 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документації)