Я ищу способ добавить эмуляцию сети в сокет.
Базовым решением будет некоторый способ добавить ограничение пропускной способности для соединения.
Идеальное решение для меня:
- Поддержка расширенных сетевых свойств (латентность, потеря пакетов)
- с открытым исходным кодом
- Имейте похожий API как стандартные сокеты (или обертывания вокруг них)
- Работайте как с Windows, так и с Linux
- Поддержка IPv4 и IPv6
Я видел несколько параметров, которые работают на системном уровне или даже как прокси (Dummynet, WANem, neten и т.д.), но это не сработает для меня, потому что я хочу иметь возможность эмулировать каждый сокет вручную (например, откройте один сокет с эмуляцией модема и один с эмуляцией 3G. В основном я хочу знать, как это делают эти инструменты.
EDIT: Мне нужно встроить эту функцию в свой собственный продукт, поэтому использование дополнительного блока или стороннего инструмента, требующего ручной настройки, неприемлемо. Я хочу написать код, который делает то же самое, что и эти инструменты, и мой вопрос - как это сделать.
Эпилог: Оглядываясь назад, мой вопрос был немного обманчивым. По-видимому, нет никакого способа сделать то, что я хотел непосредственно в сокете. Существует два варианта:
Добавить задержки для отправки/получения (на основе ответа @PaulCoccoli):
добавив задержку перед отправкой и получением, вы можете получить очень грубую симуляцию сети (постоянная задержка для задержки, отправка задержки, чтобы не отправлять больше, чем X байт в секунду, для полосы пропускания).
Пол ответил и прокомментировал мне большое вдохновение, поэтому я награждаю его щедростью.
Добавьте логику моделирования сети в качестве прокси (на основе ответов @m0she и других):
Либо отправьте запрос через прокси, либо используйте прокси для перехвата запросов, а затем добавьте желаемое имитирование. Тем не менее, имеет смысл использовать готовое решение вместо написания собственной реализации прокси - из того, что я видел, Dummynet, вероятно, лучший выбор (это что делает webpagetest.org). Другие варианты приведены в ответах ниже, я также добавлю DonsProxy
Это лучший способ сделать это, поэтому я принимаю этот ответ.