В нашем программном обеспечении произошла ошибка, возникающая при получении тайм-аута соединения. Эти ошибки очень редки (обычно, когда моя связь прерывается нашей внутренней сетью). Как я могу создать такой эффект искусственно, чтобы я мог протестировать наше программное обеспечение?
Если это имеет значение, приложение написано на C ++ / MFC с использованием классов CAsyncSocket.
Редактировать:
Я попытался использовать несуществующий хост, и я получаю ошибку сокета:
WSAEINVAL (10022) Неверный аргумент
Моей следующей попыткой было использовать предложение Александра подключиться к другому порту, например 81 (хотя на моем собственном сервере). Это сработало отлично. Точно так же, как потерянное соединение (ожидание 60 секунд, затем ошибка). Спасибо!
источник
Ответы:
Подключитесь к существующему хосту, но к порту, заблокированному межсетевым экраном, который просто отбрасывает пакеты TCP SYN. Например, www.google.com:81.
источник
Подключитесь к не маршрутизируемому IP-адресу, например 10.255.255.1.
источник
urllib
это вернет исключение «No route to host». К вашему сведениюЕсли вы работаете на Unix-машине, вы можете запустить прослушивание порта, используя netcat:
Затем измените ваш сервис так, чтобы он вызывал все, что обычно делает с этим портом, например, http: // localhost: 8099 / some / sort / of / endpoint
Затем ваша служба откроет соединение и запишет данные, но никогда не получит ответ, и, следовательно, предоставит вам тайм-аут чтения (а не отказ в соединении)
источник
ssh alanse@localhost -p 8099
, похоже, что это так.kill -STOP <pid>
(или просто нажмите CTRL-Z, не вставляя в фоновом режиме). Система будет действовать так, как если бы сервер работал, но подождать, пока сервер примет соединение, что приведет к таймауту соединения (errno 110).Следующий URL всегда дает время ожидания и объединяет лучшие ответы @Alexander и @ Emu, приведенные выше:
http://example.com:81
Использование
example.com:81
- это улучшение ответа Александра, потому что example.com зарезервирован стандартом DNS, поэтому он всегда будет недоступен, в отличие от тогоgoogle.com:81
, который может измениться, если Google захочет. Кроме того, посколькуexample.com
он определен как недоступный, вы не будете наводнять серверы Google.Я бы сказал, что это улучшение по сравнению с ответом @ emu, потому что его намного легче запомнить.
источник
example.com
разрешение до 93.184.216.34 и на самом деле служит короткий HTML-код, объясняющий, что это пример домена ... порт 81 по-прежнему не отвечает.httpstat.us
качестве ответа @AndyTheEntity в своем ответе.example.com
это не коммерческий домен, это одно из немногих доменных имен, которые явно указаны как непригодные для использования. Никто не может владеть,example.com
и DNS-маршрутизаторы знают, что он никогда не маршрутизирует на реальный адрес. Так что серверное время никому не стоит, в этом нет ничего плохогоexample.com
. За доменом стоит инфраструктура, поэтому каждый запрос стоит денег IANA. На допустимое использование ссылаются в RFC 2606 и RFC 6761. Вы не можете свободно использовать домены для любых целей, например,flodding
вместо других серверов, как вы упоминаете. Ваша претензияexample.com is defined to be unreachable
неверна, она достижима. Порт 81 сейчас недоступен, но где это определено, чтобы быть гарантированным в будущем?.test
домен верхнего уровня, а неexample.com
, но эти домены были явно настроены для этой цели. Да, это может стоить IANA немного денег, но это услуга, которую они предоставляют. Наши DNS-сборы платят за это.Множество хороших ответов, но, похоже, самое чистое решение - это услуга
http://httpstat.us/504?sleep=60000
Вы можете настроить время ожидания (до 230 секунд) и возможный код возврата.
источник
Вы можете использовать Python REPL для имитации времени ожидания при получении данных (т. Е. После успешного установления соединения). Ничего, кроме стандартной установки Python не требуется.
Теперь он ждет входящего соединения. Подключите все, что вы хотите проверить
localhost:9000
. Когда вы это сделаете, Python примет соединение иaccept()
вернет его. Если вы не отправляете какие-либо данные черезclientsocket
сокет, время ожидания следующего звонка должно истечьrecv()
.источник
s.listen(5)
раньшеs.accept()
?while True:
цикле, и это, похоже, является хорошим долговременным местом ожидания для тестирования.Все это не маршрутизируемые.
источник
10.0.0.0
и10.255.255.255
запускались вместо тайм-аута.10.255.255.1
,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 Payload:
Ответ API (через 15 секунд):
Программа тайм-аута сервера на macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
источник
Вы можете установить драйвер Microsoft Loopback, который создаст для вас отдельный интерфейс. Затем вы можете подключиться к нему к какой-либо вашей службе (ваш собственный хост). Затем в Network Connections вы можете отключить / включить такой интерфейс ...
источник
Несмотря на то, что не совсем ясно, какой именно OP хочет проверить: есть разница между попыткой подключения к несуществующему хосту / порту и временем ожидания уже установленного соединения. Я хотел бы пойти с Робом и подождать, пока соединение не заработает, а затем потянуть кабель. Или - для удобства - используйте виртуальную машину, работающую в качестве тестового сервера (с сетевым мостовым соединением), и просто деактивируйте интерфейс виртуальной сети после установления соединения.
источник
Техника, которую я часто использую для симуляции времени ожидания случайного соединения, заключается в использовании переадресации локального порта ssh.
Это будет перенаправлять трафик на localhost: 12345 на realserver.com:80. Вы также можете сделать это на своем локальном компьютере, если хотите:
Таким образом, вы можете направить ваше приложение на локальный и пользовательский порт, и трафик будет перенаправлен на целевой хост: порт. Затем вы можете выйти из этой оболочки (вам также может понадобиться сочетание клавиш ctrl + c после выхода из нее), и это прекратит переадресацию, в результате чего ваше приложение увидит потерю соединения.
источник
Подключите сетевой кабель к коммутатору, который не имеет других подключений / кабелей. Это должно работать имхо.
источник
В прошлом я использовал несколько тактик для симуляции сетевых проблем;
Одна из этих идей может дать вам некоторые средства для искусственного создания сценария, который вам нужен
источник
В зависимости от того, какое программное обеспечение брандмауэра у вас установлено / доступно, вы должны иметь возможность заблокировать исходящий порт, а в зависимости от того, как настроен ваш брандмауэр, он должен просто отбросить пакет запроса на подключение. Нет запроса на соединение, нет соединения, истекло время ожидания. Это, вероятно, сработало бы лучше, если бы оно было реализовано на уровне маршрутизатора (они склонны отбрасывать пакеты, а не отправлять перезагрузки или что-то подобное для ситуации), но обязательно найдется программный пакет, который тоже справится с задачей.
источник
Самый простой способ - сбросить соединение с помощью CurrPorts .
Однако, чтобы выполнить модульное тестирование кода обработки исключений, возможно, вам следует рассмотреть возможность абстрагирования кода вашего сетевого подключения и написать заглушку, макет или декоратор, которые генерируют исключения по требованию. После этого вы сможете протестировать логику обработки ошибок приложения без необходимости использовать сеть.
источник
recv()
к немедленному сбою следующего ), но не смог найти способ имитировать тайм-аут (т. Е. Больше не передаются данные, но соединение остается открытым).У меня были проблемы в том же духе, что и у вас. Чтобы проверить поведение программного обеспечения, я просто отключил сетевой кабель в соответствующее время. Я должен был установить точку останова прямо перед тем, как хотел отключить кабель.
Если бы я делал это снова, я бы вставил переключатель (нормально замкнутая кратковременная кнопка) в сетевой кабель.
Если физическое отключение вызывает другое поведение, вы можете подключить свой компьютер к дешевому концентратору и поместить упомянутый выше коммутатор между вашим концентратором и основной сетью.
- РЕДАКТИРОВАТЬ - Во многих случаях вам потребуется работающее сетевое соединение, пока вы не доберетесь до определенной точки в вашей программе, ТОГДА вы захотите отключиться, используя одно из многих предложенных предложений.
источник
Для меня самым простым способом было добавить статический маршрут на офисный маршрутизатор на основе сети назначения. Просто перенаправьте трафик на не отвечающий хост (например, на ваш компьютер), и вы получите тайм-аут запроса.
Лучшим для меня было то, что статическим маршрутом можно управлять через веб-интерфейс и легко включать / отключать.
источник
Вы можете попытаться подключиться к одному из известных веб-сайтов через порт, который может быть недоступен извне - например, 200. Большинство брандмауэров работают в режиме DROP, и он будет имитировать время ожидания для вас.
источник