Искусственное создание ошибки тайм-аута соединения - PullRequest
254 голосов
/ 19 сентября 2008

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

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

Edit:

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

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

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

Ответы [ 21 ]

397 голосов
/ 25 мая 2009

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

271 голосов
/ 19 сентября 2008

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

35 голосов
/ 26 мая 2016

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

nc -l 8099

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

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

21 голосов
/ 07 ноября 2016

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

http://example.com:81

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

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

16 голосов
/ 17 апреля 2013

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

13 голосов
/ 23 июля 2015
  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

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

9 голосов
/ 20 февраля 2014

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

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

8 голосов
/ 12 марта 2010

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

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

4 голосов
/ 15 августа 2016

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

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

2 голосов
/ 12 сентября 2016

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

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

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

{
    "timeout_length": 15000
}

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

{
    "response": "ok"
}

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

...