Моделирование сетевых условий с помощью сокета C/C++

Я ищу способ добавить эмуляцию сети в сокет.

Базовым решением было бы добавление ограничения полосы пропускания к соединению.

Идеальным решением для меня было бы:

  • Поддерживать расширенные сетевые свойства (задержка, потеря пакетов)
  • Открытый исходный код
  • Иметь API, аналогичный стандартным сокетам (или обертывать их)
  • Работать как в Windows, так и в Linux
  • Поддержка IPv4 и IPv6

Я видел несколько вариантов, которые работают на системном уровне или даже в качестве прокси (Dummynet, WANem, neten и т. д.), но это не сработает для меня, потому что я хочу иметь возможность эмулировать каждый сокет вручную (например, открыть один сокет с эмуляцией модема и один с эмуляцией 3G. В основном я хочу знать, как эти инструменты это делают.

РЕДАКТИРОВАТЬ:Мне нужно встроить эту функциональность в свой собственный продукт, поэтому использование дополнительного блока или стороннего инструмента, требующего ручной настройки, неприемлемо. Я хочу написать код, который делает то же самое, что и эти инструменты. сделать, а у меня вопрос как это сделать.

Эпилог:Оглядываясь назад, мой вопрос немного ввел в заблуждение.Видимо, нет возможности сделать то, что я хотел прямо на сокете.Есть два варианта:

Добавление задержек для операции отправки/получения(на основе ответа @PaulCoccoli):
добавив задержку перед отправкой и получением, вы можете получить очень грубую симуляцию сети (постоянная задержка для задержки, задержка отправки, чтобы не отправлять более X байтов в секунду, для пропускной способности).
Ответ и комментарий Пола очень вдохновили меня, поэтому я награждаю его наградой.

Добавьте логику моделирования сети в качестве прокси(на основе ответа @m0she и других):
Либо отправить запрос через прокси, либо использовать прокси для перехвата запросов, после чего добавить нужную симуляцию. Тем не менее, имеет больше смысла использовать готовое решение вместо того, чтобы писать собственную реализацию прокси - из того, что я видел, Dummynet, вероятно, является лучшим выбором (это то, что делает webpagetest.org). Другие варианты указаны в ответах ниже, я также добавлю DonsProxy
Это лучший способ сделать это, поэтому я принимаю этот ответ.

15
задан Yasei No Umi 19 July 2012 в 07:36
поделиться