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

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

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

Edit:

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

WSAEINVAL (10022) Invalid argument

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

Ответы на вопрос(18)

CurrPorts.

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

 19 июл. 2018 г., 21:17
Я ценю этот ответ за предложение модульного теста, который проверяет исключения подключения по требованию.
 16 апр. 2013 г., 23:56
С CurrPorts я, кажется, могу только закрыть соединение (что вызывает следующееrecv() немедленно потерпеть неудачу), но не смог найти способ смоделировать тайм-аут (то есть данные больше не передаются, но соединение остается открытым).

lexander и @ Emu выше:

http://example.com:81

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

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

 24 апр. 2017 г., 18:33
сейчас вижуexample.com разрешается до 93.184.216.34 и фактически служит коротким HTML-кодом, объясняющим его в качестве примера домена ... порт 81 по-прежнему не отвечает.

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

nc -l 8099

Затем измените ваш сервис так, чтобы он обычно вызывал этот порт, например,HTTP: // локальный: 8099 / некоторые / сортировать / из / конечной точки

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

 29 июн. 2017 г., 11:39
@AlanSE - что ты имеешь в виду? Вы можете иметь что-нибудь после номера порта; Netcat не заботится, так как ему нечего обрабатывать никакие URL
 29 июн. 2017 г., 13:56
@ TomChamberlain Ой, подожди, я мог бы знать, что я делал неправильно. Я пытаюсь смоделировать тайм-аут соединения SSH. Поэтому я даю ему localhost, порт 8099, но ранее я не давал имя пользователя, поэтому, если я просто что-то добавлюssh [email protected] -p 8099Похоже, что это делает.
 30 мая 2018 г., 14:39
Чтобы проверить время ожидания соединения на уровне сокета, заморозьте процесс nc с помощью командыkill -STOP <pid> (или просто CTRL-Z без фона). Система будет действовать так, как если бы сервер работал, но подождать, пока сервер примет соединение, что приведет к тайм-ауту соединения (errno 110).
 18 авг. 2016 г., 09:55
Это полезно, поскольку вы можете видеть любые данные, которые отправляет ваше приложение. Вы можете проверить, запрашивает ли ваша заявка ответ.
 28 июн. 2017 г., 22:32
Это верно для перехода к какой-то конечной точке, как уже упоминалось, но если я пытаюсь подключиться каким-либо другим способом, это быстро приводит к отказу в соединении, а это не то поведение, которое я пытаюсь смутить прямо сейчас.

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

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

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

JSON Payload:

{
    "timeout_length": 15000
}

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

{
    "response": "ok"
}

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

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

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

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

 28 июн. 2018 г., 15:39
Максимум 10 секунд (если вы введете большее число, оно ответит через 10 секунд)

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

олучении данных (то есть после успешного установления соединения). Ничего, кроме стандартной установки 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().

 01 июл. 2017 г., 05:04
Я был в состоянии поставить слушать и принимать части вwhile True: цикл, и это, кажется, делает хороший длительный тайм-аут назначения для тестирования.
 13 янв. 2019 г., 11:48
Это работает, но дает «время ожидания чтения» ошибка, которая не совпадает с «тайм-аутом соединения»;
 01 сент. 2015 г., 09:56
@bmaupin Звучит разумно, наверное, я просто забыл это. Отредактировал его сейчас (однако с очередью невыполненных заданий 0), спасибо!
 31 авг. 2015 г., 21:16
Не работает для меня; чего-то не хватает. возможноs.listen(5) доs.accept()?

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

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

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

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

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

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

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

Решение Вопроса

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

 08 дек. 2017 г., 16:51
Это даст соединение отказано не тайм-аут.
 09 апр. 2015 г., 17:19
Если это не ваш собственный сервер, то вы можете использовать другие серверы для тестирования. Используйте цивилизованное решение, такое как упомянутое ниже эму, выбрав немаршрутизируемый IP-адрес, например 10.255.255.1, или настройте собственный виртуальный сервер для тестирования.
 14 авг. 2014 г., 05:58
Этот ответ прост и работает так же, как ответ @ emu ниже. Я понимаю, что этот ответ не собирался предлагать использовать google.com:81, но смысл в том, чтобы использовать другой заблокированный порт. Таким образом, вы всегда можете использовать & lt; your-own-ip & gt;: & lt; заблокированный-порт & gt ;.
 27 февр. 2016 г., 00:39
ОП говорит, что он подключен к порту 81on his own server и получил тайм-аут. Это сработало и для меня. Решение emu дало мне исключение UnknownHostException для Android.
 09 дек. 2015 г., 22:48
Я думаю, что Google, возможно, заблокировал этот порт. Когда я тестирую это с Chrome, я просто "Сервер недоступен". Когда я использую трюк @ emu ниже, соединение зависает, как и ожидалось. Я что-то пропустил?

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

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

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

Pull out the network cable Switch off the switch (ideally with the switch that the computer is plugged into still being powered so the machine maintains it's "network connection") between your machine and the "target" machine Run firewall software on the target machine that silently drops received data

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

pathod

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

 08 дек. 2016 г., 13:21
Не то же самое, что время ожидания

10.0.0.0 , 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0 ,192.168.255.255

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

 20 июн. 2017 г., 13:44
(Как я прокомментировал принятый ответ) Когда я тестировал XMLHttpRequest в Node.js, соединения с10.0.0.0 а также10.255.255.255 выдал ошибку EACCES вместо тайм-аута.10.255.255.1, 172.16.0.0, 172.31.255.255, 192.168.0.0, а также192.168.255.255 сделал тайм-аут, однако.

Ваш ответ на вопрос