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

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

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

Edit:

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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

nc -l 8099

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

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

Ответ 4

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

http://example.com:81

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

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

Ответ 5

Вы можете использовать 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().

Ответ 6

  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

Все это не маршрутизируемые.

Ответ 7

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

С конфигурацией (взятой из их примеров) 200:[email protected]:dr вы получите соединение, которое случайно падает.

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

Например, если вы хотите протестировать запрос, на который требуется ответить в течение 15 секунд, вы просто сделаете запрос на отправку в API macgyver.

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

{
    "timeout_length": 15000
}

Ответ API (через 15 секунд):

{
    "response": "ok"
}

Программа ожидания сервера на macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

Ответ 11

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

Ответ 12

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

Ответ 13

Техника, которую я часто использую для симуляции времени ожидания произвольного соединения, заключается в использовании переадресации локального порта ssh.

ssh -L 12345:realserver.com:80 localhost

Это перенаправит трафик на localhost: 12345 на realserver.com:80. Вы также можете сделать это на своем локальном компьютере, если хотите:

ssh -L 12345:localhost:8080 localhost

Таким образом, вы можете направить ваше приложение на локальный и пользовательский порт, и трафик будет перенаправлен на целевой хост: порт. После этого вы можете выйти из этой оболочки (вам также может понадобиться сочетание клавиш ctrl + c после выхода из нее), и это прекратит переадресацию, в результате чего ваше приложение увидит потерю соединения.

Ответ 14

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

Ответ 15

Мне нравится использовать CurrPorts для управления сетевыми подключениями при отладке. Иногда просто отсоединение сетевого кабеля будет делать так же хорошо (как сообщается другими). ​​

Ответ 16

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

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

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

Ответ 17

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

Ответ 18

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

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

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

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

Ответ 19

Проще всего было бы отказаться от вашего соединения, используя CurrPorts.

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

Ответ 20

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

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

Ответ 21

Множество хороших ответов, но, похоже, самое чистое решение - это услуга

http://httpstat.us/504?sleep=60000

Вы можете настроить время ожидания (до 230 секунд) и возможный код возврата.

Ответ 22

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