Искусственно создать ошибку тайм-аута соединения



У меня была ошибка в нашем программном обеспечении, которая возникает, когда я получаю тайм-аут соединения. Эти ошибки очень редки (обычно, когда мое соединение отбрасывается нашей внутренней сетью). Как я могу создать такой эффект искусственно, чтобы я мог протестировать наше программное обеспечение?

Если это имеет значение, приложение написано на C++/MFC с использованием классов CAsyncSocket.

Edit:

Я пробовал использовать несуществующий хост, и я получаю ошибку сокета:

WSAEINVAL (10022) недопустимый аргумент

моя следующая попытка была использовать Александрпредложение о подключении к другому порту, например 81 (на моем собственном сервере, хотя). Это сработало отлично. Точно так же, как отброшенное соединение (60 секунд ожидания, затем ошибка). Спасибо!

200   19  

19 ответов:

подключитесь к существующему хосту, но к порту, который заблокирован брандмауэром, который просто отбрасывает пакеты TCP SYN. Например, www.google.com:81.

подключение к не маршрутизируемому IP-адресу, например 10.255.255.1.

Если вы находитесь на машине unix, вы можете запустить прослушивание порта с помощью netcat:

nc -l 8099

затем измените свой сервис, чтобы вызвать все, что он обычно делает с этим портом, например http://localhost:8099/some/sort/of/endpoint

затем ваша служба откроет соединение и запишет данные, но никогда не получит ответа, и поэтому даст вам тайм-аут чтения (а не соединение отказано)

вы можете использовать Python REPL для имитации тайм-аута при получении данных (т. е. после успешного установления соединения). Ничего, кроме стандартной установки Python не требуется.

Python 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        
>>> s.bind(('localhost', 9000))
>>> s.listen(0)
>>> (clientsocket, address) = s.accept()

теперь он ждет входящего подключения. Подключите все, что вы хотите проверить на localhost:9000. Когда вы это сделаете, Python примет соединение и accept() вернется он. Если вы посылаете данные через clientsocket, сокет вызывающего абонента должен тайм-аут во время следующего recv().

следующий URL-адрес всегда дает тайм-аут и сочетает в себе лучшие ответы @Alexander и @Emu выше:

http://example.com:81

используя example.com:81 это улучшение ответа Александра, потому что example.com зарезервирован стандартом DNS, поэтому он всегда будет недоступен, в отличие от google.com:81, который может измениться, если Google посчитает нужным. Кроме того, потому что example.com определяется как недостижимый, вы не будете наводнять Google сервера.

Я бы сказал, что это улучшение по сравнению с ответом @emu, потому что его намного легче запомнить.

10.0.0.0 , 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0 ,192.168.255.255

все они не маршрутизируются.

Я хотел бы обратить внимание на pathod

с конфигурацией (взятой из их примеров)200:b@100:dr вы получите соединение, которое случайно падает.

Как насчет программного решения:

установить SSH-сервер на сервере приложений. Затем используйте туннель сокетов для создания связи между локальным портом и удаленным портом на сервере приложений. Для этого можно использовать инструменты клиента ssh. Вместо этого клиентское приложение должно подключиться к сопоставленному локальному порту. Затем вы можете разбить туннель сокета по желанию, чтобы имитировать тайм-аут соединения.

Если вы хотите использовать активное соединение, вы также можете использовать http://httpbin.org/delay/#, где # - время, в течение которого сервер должен ждать ответа. Пока ваш тайм-аут короче, чем задержка ... должен имитировать эффект. Я успешно использовал его с пакетом запросов python.

вы можете изменить свой запрос, если вы отправляете что - нибудь чувствительное-не знаю, что происходит с данными, отправленными им.

есть несколько тактик, которые я использовал в прошлом для имитации сетевых проблем;

  1. вытащите сетевой кабель
  2. выключите переключатель (в идеале с переключателем, который компьютер подключен к все еще питается, поэтому машина поддерживает его "сетевое соединение") между вашей машиной и" целевой " машиной
  3. запустите брандмауэр на целевой машине, которая молча отбрасывает полученные данные

одна из этих идей может дать вам некоторые средства искусственного генерирования сценария вам нужно

вы можете установить драйвер Microsoft Loopback, который создаст для вас отдельный интерфейс. Затем вы можете подключиться на нем к какой-либо службе вашего (вашего собственного хоста). Затем в Сетевых подключениях вы можете отключить/включить интерфейс...

несмотря на то, что не совсем ясно, какой из них OP хочет проверить: есть разница между попыткой подключения к несуществующему хосту/Порту и таймаутом уже установленного соединения. Я бы пошел с Робом и подождал, пока соединение не заработает, а затем потянул за кабель. Или-для удобства - иметь виртуальную машину, работающую в качестве тестового сервера (с мостовой сетью) и просто отключающую виртуальный сетевой интерфейс после установления соединения.

существуют службы, которые позволяют искусственно создавать исходные таймауты, вызывая API, где вы указываете, сколько времени потребуется серверу для ответа. Тайм-аут сервера на macgyver является примером такой службы.

полезная нагрузка JSON:

{
    "timeout_length": 15000
}

ответ API (после 15 секунд):

{
    "response": "ok"
}

программа тайм-аута сервера включена macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

подключите сетевой кабель к коммутатору, который не имеет другого подключения/кабелей. Это должно сработать имхо.

в зависимости от того, какое программное обеспечение брандмауэра вы установили/доступно, вы должны иметь возможность блокировать исходящий порт, и в зависимости от того, как настроен ваш брандмауэр, он должен просто отбросить пакет запроса на подключение. Нет запроса на подключение, нет подключения, тайм-аут не следует. Это, вероятно, будет работать лучше, если оно будет реализовано на уровне маршрутизатора (они, как правило, отбрасывают пакеты вместо отправки сбросов или независимо от того, что эквивалентно ситуации), но обязательно будет программный пакет, который будет делать и трюк тоже.

проще всего было бы отказаться от подключения с помощью CurrPorts.

однако для модульного тестирования кода обработки исключений, возможно, вам следует рассмотреть возможность абстрагирования кода сетевого подключения и написать заглушку, макет или декоратор, который выдает исключения по требованию. Затем вы сможете протестировать логику обработки ошибок приложения без необходимости фактического использования сети.

У меня были проблемы в том же направлении, что и у вас. Чтобы проверить поведение программного обеспечения, я просто отключил сетевой кабель в соответствующее время. Мне пришлось установить точку останова прямо перед тем, как я хотел отключить кабель.

Если бы я делал это снова, я бы поставил переключатель (обычно закрытую мгновенную кнопку) в сетевой кабель.

Если физическое отключение вызывает другое поведение, вы можете подключить компьютер к дешевому концентратору и поставить переключатель I упомянутый выше между вашим хабом и основной сетью.

-- EDIT -- Во многих случаях вам понадобится сетевое подключение, работающее до тех пор, пока вы не доберетесь до определенной точки в своей программе, тогда вы захотите отключить, используя одно из многих предложенных предложений.

для меня самым простым способом было добавление статического маршрута на офисном маршрутизаторе на основе целевой сети. Просто направьте трафик на какой-то не отвечающий хост (например, ваш компьютер), и вы получите тайм-аут запроса.

лучше всего для меня было то, что статический маршрут можно управлять через веб-интерфейс и легко включать/отключать.

вы можете попробовать подключиться к одному из известных веб-сайтов на порту, который может быть недоступен извне - 200 например. Большинство брандмауэров работают в режиме DROP, и он будет имитировать тайм-аут для вас.

    Ничего не найдено.

Добавить ответ:
Отменить.