Вопрос

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

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

Редактировать:

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

WSAEINVAL (10022) Неверный аргумент

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

Это было полезно?

Решение

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

Другие советы

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

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

nc -l 8099

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

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

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

http://example.com:81

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

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

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

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

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

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

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

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

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

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

Возможно, вы захотите изменить свой запрос, если отправляете что-то конфиденциальное — понятия не имею, что происходит с отправленными им данными.

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

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

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

{
    "timeout_length": 15000
}

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

{
    "response": "ok"
}

Программа Server Timeout на Macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

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

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

Метод, который я часто использую для имитации тайм-аута случайного соединения, заключается в использовании переадресации локального порта ssh.

ssh -L 12345:realserver.com:80 localhost

Это будет направлять трафик на Localhost: 12345 на RealServer.com:80 Вы также можете зацикливаться на своей собственной локальной машине, если хотите:

ssh -L 12345:localhost:8080 localhost

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

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

В прошлом я использовал несколько тактик для моделирования проблем с сетью;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top