Sztucznie twórz błąd przekroczenia limitu czasu połączenia

291

Mam błąd w naszym oprogramowaniu, który pojawia się, gdy otrzymuję limit czasu połączenia. Te błędy są bardzo rzadkie (zwykle, gdy moje połączenie zostaje przerwane przez naszą sieć wewnętrzną). Jak mogę sztucznie wygenerować taki efekt, aby przetestować nasze oprogramowanie?

Jeśli ma to znaczenie, aplikacja jest napisana w C ++ / MFC przy użyciu klas CAsyncSocket.

Edytować:

Próbowałem użyć nieistniejącego hosta i pojawia się błąd gniazda:

WSAEINVAL (10022) Niepoprawny argument

Następną moją próbą było skorzystanie z sugestii Aleksandra , aby połączyć się z innym portem, np. 81 (choć na moim własnym serwerze). To działało świetnie. Dokładnie to samo co zerwane połączenie (60 sekund oczekiwania, potem błąd). Dziękuję Ci!

Mark Ingram
źródło
Cześć Mark, próbowałem rozwiązania, które działa dla Ciebie, ale otrzymuję # 503 (usługa niedostępna.). Nie powinien to być jeden z nich, # 504 (Limit czasu bramy), # 599 (Błąd przekroczenia limitu czasu połączenia z siecią), # 598 (Błąd przekroczenia limitu czasu odczytu sieci).
CoDe,

Odpowiedzi:

297

Połącz się z istniejącym hostem, ale z portem zablokowanym przez zaporę, która po prostu upuszcza pakiety TCP SYN. Na przykład www.google.com:81.

Alexander
źródło
6
Ta odpowiedź jest prosta i działa podobnie jak poniżej odpowiedź @ emu. Rozumiem, że ta odpowiedź nie miała na celu sugerowania użycia google.com:81, ale chodzi tutaj o użycie innego zablokowanego portu. Więc zawsze możesz użyć <twój-własny->: <blokowany-port>.
James Selvakumar
6
O ile nie jest to twój własny serwer, niegrzecznie jest trafiać na inne serwery w celu przetestowania. Użyj cywilizowanego rozwiązania, takiego jak wspomniane poniżej emu, uderzając w niemożliwy do routingu adres IP, taki jak 10.255.255.1, lub skonfiguruj własny wirtualny serwer do celów testowych.
zeeshan
2
Myślę, że Google mógł zablokować ten port. Kiedy testuję to w Chrome, po prostu „Serwer niedostępny”. Kiedy użyję sztuczki @ emu poniżej, połączenie zawiesza się zgodnie z oczekiwaniami. Czy coś brakuje?
entpnerd
OP twierdzi, że podłączył się do portu 81 na swoim serwerze i przekroczył limit czasu. To też działało dla mnie. Rozwiązanie emu dało mi wyjątek UnknownHostException na Androida.
Barry Fruitman
2
To da połączenie odmówione, a nie limit czasu.
Mehdi,
425

Połącz się z niemożliwym do routingu adresem IP, takim jak 10.255.255.1.

emu
źródło
12
To chyba lepsza odpowiedź, ponieważ google.com:81 może być kiedyś osiągnięty.
Gui13
138
... a ponieważ wysyłanie losowych pakietów na serwery innych osób z testów jednostkowych jest niegrzeczne.
Glenn Maynard,
15
To nie zawsze zadziała. Na przykład w przypadku Pythona urllibzwróci wyjątek „Brak trasy do hosta”. Do Twojej wiadomości
Mike Shultz
8
10.0.0.0, 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0, 192.168.255.255 wszystkie te nie są routowalne.
rajesh_kw
4
Błąd „Brak trasy do hosta” wspomniany przez @FHI pojawia się zasadniczo w dwóch przypadkach: (a) podczas próby połączenia się z nieosiągalnym hostem w lokalnej sieci LAN (co oznacza, że ​​nie odpowiada na zapytania ARP, więc jest to w zasadzie „ Limit czasu ARP ”). I (b) gdy router zwraca odpowiedni błąd ICMP. Pierwszy przypadek ma miejsce, jeśli jesteś w tej samej podsieci, co prywatny adres IP, który testujesz. Drugi przypadek, jeśli router nie wie, jak skierować pakiet do miejsca docelowego, ale w niektórych przypadkach po prostu upuszcza pakiet bez wysyłania błędu ICMP.
Ale
47

Jeśli korzystasz z komputera z systemem uniksowym, możesz rozpocząć nasłuchiwanie portu za pomocą netcat:

nc -l 8099

Następnie zmodyfikuj usługę, aby wywoływała to, co zwykle robi z tym portem, np. Http: // localhost: 8099 / some / sort / of / endpoint

Następnie twoja usługa otworzy połączenie i zapisze dane, ale nigdy nie otrzyma odpowiedzi, a więc da ci limit czasu na odczyt (zamiast odmowy połączenia)

Tom Chamberlain
źródło
1
Jest to przydatne, ponieważ możesz zobaczyć dane przesyłane przez aplikację. Możesz sprawdzić, czy Twoja aplikacja prosi o odpowiedź.
Paul,
Jest to prawda w przypadku nawigacji do jakiegoś punktu końcowego, jak wspomniano, ale jeśli spróbuję połączyć się w inny sposób, szybko daje odmowę połączenia, co nie jest zachowaniem, które próbuję teraz wyśmiewać.
AlanSE
@AlanSE - co masz na myśli? Możesz mieć wszystko po numerze portu; netcat nie będzie się tym przejmował, ponieważ nie ma nic do obsługi żadnych adresów URL
Tom Chamberlain
@TomChamberlain Och, czekaj, mogę wiedzieć, co robiłem źle. Próbuję symulować limit czasu połączenia ssh. Podaję więc localhost, port 8099, ale poprzednio nie podałem nazwy użytkownika, więc jeśli tylko coś wstawię ssh alanse@localhost -p 8099, wygląda na to, że tak.
AlanSE
7
Aby przetestować limit czasu połączenia na poziomie gniazda, zamroź proces nc za pomocą a kill -STOP <pid>(lub po prostu CTRL-Z bez wprowadzania tła). System będzie działał tak, jakby serwer był uruchomiony, ale zaczekaj, aż serwer zaakceptuje połączenie, co spowoduje przekroczenie limitu czasu połączenia (errno 110).
filant
27

Poniższy adres URL zawsze podaje limit czasu i łączy najlepsze z powyższych odpowiedzi @Alexander i @ Emu:

http://example.com:81

Użycie example.com:81jest ulepszeniem odpowiedzi Aleksandra, ponieważ example.com jest zarezerwowany przez standard DNS, więc zawsze będzie niedostępny, w przeciwieństwie do tego google.com:81, co może się zmienić, jeśli Google ma na to ochotę. Ponadto, ponieważ example.comjest zdefiniowany jako nieosiągalny, nie zalejesz serwerów Google.

Powiedziałbym, że to poprawa w stosunku do odpowiedzi @ emu, ponieważ jest o wiele łatwiejsza do zapamiętania.

szybowiec
źródło
2
obecnie widzę example.comrozwiązanie w wersji 93.184.216.34 i faktycznie wyświetla krótki kod HTML wyjaśniający, że jest to przykładowa domena ... port 81 nadal nie odpowiada.
Beni Cherniavsky-Paskin
Pytanie naprawdę brzmi, czy example.com ma być w ten sposób używany. Tylko jeśli pozwolą na zalewanie pakietów testowych, ta domena jest lepsza niż jakakolwiek inna domena komercyjna. Używanie domen do takich celów bez pozwolenia jest nieetyczne, co najmniej, jeśli nie nielegalne, ponieważ kosztuje kogoś pieniądze na obsługę tych pakietów. Rozważ użycie httpstat.usjako @AndyTheEntity wskazanego w jego odpowiedzi.
Manuel
@Manuel Brakuje Ci sensu ... example.comto nie jest domena komercyjna, to jedna z niewielu nazw domen, które zostały wyraźnie określone jako niezdatne do użytku. Nikt nie może posiadać, example.coma routery DNS wiedzą, że nigdy nie kieruje na prawdziwy adres. Więc nikomu nie kosztuje to czasu serwera, nie ma nic złego w korzystaniu z niego
speedplane
@speedplane IANA jest właścicielem domeny zgodnie z przepisami i utrzymuje serwer sieciowy udostępniający stronę internetową wyjaśniającą cel example.com. Za domeną kryje się infrastruktura, dlatego każde żądanie kosztuje pieniądze IANA. Dopuszczalne użycie jest określone w RFC 2606 i RFC 6761, nie możesz swobodnie korzystać z domen w jakimkolwiek celu, jak chcesz, jak floddingzamiast innego serwera, jak wspomniałeś. Twoje roszczenie, które example.com is defined to be unreachablejest nieprawidłowe, jest osiągalne. Port 81 jest obecnie nieosiągalny, ale gdzie można to zagwarantować w przyszłości?
Manuel
Wskazywany przez Ciebie RFC pozwala na testowanie DNS. .testZalecają raczej używanie domeny najwyższego poziomu example.com, ale domeny te zostały wyraźnie skonfigurowane do tego celu. Tak, może to kosztować IANA trochę pieniędzy, ale jest to usługa, którą świadczą. Nasze opłaty DNS za to płacą.
Speedplane
23

Wiele dobrych odpowiedzi, ale najczystszym rozwiązaniem wydaje się ta usługa

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

Możesz skonfigurować czas oczekiwania (do 230 sekund) i ewentualny kod powrotu.

AndyTheEntity
źródło
16

Za pomocą Python REPL można symulować przekroczenie limitu czasu podczas odbierania danych (tj. Po pomyślnym nawiązaniu połączenia). Nie jest wymagana tylko standardowa instalacja w języku 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()

Teraz czeka na połączenie przychodzące. Połącz wszystko, co chcesz przetestować localhost:9000. Gdy to zrobisz, Python zaakceptuje połączenie i accept()je zwróci. O ile nie prześlesz żadnych danych przez clientsocket, gniazdo dzwoniącego powinno przekroczyć limit czasu podczas następnego recv().

Henrik Heimbuerger
źródło
Nie działa dla mnie; czegoś brakuje. Może s.listen(5)wcześniej s.accept()?
bmaupin
@bmaupin To brzmi rozsądnie, chyba po prostu o tym zapomniałem. Edytowałem to teraz (jednak z kolejką zaległości 0), dzięki!
Henrik Heimbuerger
1
Byłem w stanie while True:włączyć słuchanie i akceptować części w pętli, i wydaje się, że jest to miłe, trwałe miejsce do spędzania czasu na testowanie.
AlanSE
2
Działa, ale daje błąd „limit czasu odczytu”, który nie jest tym samym, co „limit czasu połączenia”
timur
13
  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

Wszystkie te są nierutowalne.

rajesh_kw
źródło
2
(Jak skomentowałem zaakceptowaną odpowiedź) Kiedy testowałem XMLHttpRequest w Node.js, połączenia do 10.0.0.0i 10.255.255.255wystrzeliłem błąd EACCES zamiast przekroczenia limitu czasu. 10.255.255.1, 172.16.0.0, 172.31.255.255, 192.168.0.0, A 192.168.255.255nie limit czasu, jednak.
Jamie Birch,
9

Chciałbym zwrócić uwagę wszystkich na pathod

Dzięki konfiguracji (wziętej z ich przykładów) 200:b@100:drotrzymasz połączenie, które losowo znika.

amenthes
źródło
1
Nie to samo, co
przerwa
8

Co powiesz na rozwiązanie programowe:

Zainstaluj serwer SSH na serwerze aplikacji. Następnie użyj tunelu gniazda, aby utworzyć połączenie między portem lokalnym a portem zdalnym na serwerze aplikacji. Możesz do tego użyć narzędzi klienta ssh. Niech aplikacja kliencka połączy się z zamapowanym portem lokalnym. Następnie możesz przerwać tunel gniazdowy, aby symulować limit czasu połączenia.

Stoneboy
źródło
4

Jeśli chcesz użyć aktywnego połączenia, możesz także użyć http://httpbin.org/delay/# , gdzie # to czas, przez który serwer musi czekać przed wysłaniem odpowiedzi. Tak długo, jak twój limit czasu jest krótszy niż opóźnienie ... powinien symulować efekt. Pomyślnie użyłem go z pakietem zapytań python.

Możesz zmodyfikować swoje żądanie, jeśli wysyłasz coś poufnego - nie masz pojęcia, co dzieje się z przesyłanymi do nich danymi.

RoHS4U
źródło
Maksymalnie 10 sekund (jeśli podasz wyższą liczbę, zareaguje ona po 10 sekundach)
Harry Wood
2

Dostępne są usługi, które pozwalają sztucznie tworzyć limity czasu pochodzenia, wywołując interfejs API, w którym określasz, ile czasu zajmie serwerowi odpowiedź. Limit czasu serwera w macgyver jest przykładem takiej usługi.

Na przykład, jeśli chcesz przetestować żądanie, które zajmuje 15 sekund, wystarczy wysłać zapytanie do API Macgyver.

Ładowność JSON:

{
    "timeout_length": 15000
}

Odpowiedź API (po 15 sekundach):

{
    "response": "ok"
}

Program Timeout serwera na Macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

Timothy Moody
źródło
1

Możesz zainstalować sterownik Microsoft Loopback, który utworzy dla ciebie osobny interfejs. Następnie możesz połączyć się z nią do swojego serwisu (własnego hosta). Następnie w Połączenia sieciowe możesz wyłączyć / włączyć taki interfejs ...

Marcin Gil
źródło
1

Mimo że nie jest do końca jasne, które OP chce przetestować: istnieje różnica między próbą połączenia z nieistniejącym hostem / portem a przekroczeniem limitu czasu już ustanowionego połączenia. Chciałbym pójść z Robem i poczekać, aż połączenie się sprawdzi, a następnie wyciągnąć kabel. Lub - dla wygody - mieć maszynę wirtualną działającą jako serwer testowy (z mostkowaną siecią) i po prostu dezaktywować interfejs sieci wirtualnej po ustanowieniu połączenia.


źródło
1

Techniką, której często używam do symulowania przypadkowego przekroczenia limitu czasu połączenia, jest użycie przekierowania lokalnego portu ssh.

ssh -L 12345:realserver.com:80 localhost

Spowoduje to przekazanie ruchu na localhost: 12345 do realserver.com:80 Możesz zapętlić to również na swoim komputerze lokalnym, jeśli chcesz:

ssh -L 12345:localhost:8080 localhost

Możesz więc skierować aplikację na lokalny host i niestandardowy port, a ruch zostanie skierowany do hosta docelowego: portu. Następnie możesz wyjść z tej powłoki (po wyjściu może być też konieczne naciśnięcie klawiszy Ctrl + c), a to zabije przekazywanie, które spowoduje utratę połączenia z aplikacją.

jdi
źródło
0

Podłącz kabel sieciowy do przełącznika, który nie ma innych połączeń / kabli. To powinno działać imho.

GHad
źródło
0

Jest kilka taktyk, których użyłem w przeszłości do symulacji problemów z siecią;

  1. Wyciągnij kabel sieciowy
  2. Wyłącz przełącznik (najlepiej za pomocą przełącznika, do którego komputer jest podłączony, nadal jest zasilany, aby urządzenie utrzymywało „połączenie sieciowe”) między komputerem a maszyną „docelową”
  3. Uruchom oprogramowanie zapory na komputerze docelowym, które po cichu upuszcza odebrane dane

Jeden z tych pomysłów może dać ci sztuczny sposób na wygenerowanie potrzebnego scenariusza

Obrabować
źródło
0

W zależności od zainstalowanego / dostępnego oprogramowania zapory, powinieneś być w stanie zablokować port wychodzący, aw zależności od konfiguracji zapory powinien po prostu upuścić pakiet żądania połączenia. Brak żądania połączenia, brak połączenia, upływa limit czasu. Prawdopodobnie działałoby to lepiej, gdyby zostało zaimplementowane na poziomie routera (mają tendencję do upuszczania pakietów zamiast wysyłania resetów lub cokolwiek w tym przypadku jest odpowiednikiem), ale na pewno znajdzie się pakiet oprogramowania, który by to zrobił.

Matthew Scharley
źródło
0

Najłatwiej byłoby porzucić połączenie za pomocą CurrPorts .

Aby jednak przetestować kod obsługi wyjątków, należy rozważyć wyodrębnienie kodu połączenia sieciowego i napisanie kodu pośredniczącego, próbnego lub dekoratora, który generuje wyjątki na żądanie. Będziesz wtedy mógł przetestować logikę obsługi błędów aplikacji bez faktycznego korzystania z sieci.

Matt Howells
źródło
Z CurrPorts wydaje mi się, że mogę tylko zamknąć połączenie (co powoduje recv()natychmiastowe niepowodzenie następnego ), ale nie mogłem znaleźć sposobu na symulację przekroczenia limitu czasu (tzn. Nie jest przesyłane więcej danych, ale połączenie pozostaje otwarte).
Henrik Heimbuerger
Doceniłem tę odpowiedź za zasugerowanie testu jednostkowego, który kpi z wyjątków połączenia na żądanie.
Danny Bullis,
0

Miałem problemy w taki sam sposób jak ty. Aby przetestować zachowanie oprogramowania, po prostu odłączyłem kabel sieciowy w odpowiednim czasie. Musiałem ustalić punkt przerwania tuż przed tym, jak chciałem odłączyć kabel.

Gdybym to zrobił ponownie, umieściłbym przełącznik (normalnie zamknięty przycisk chwilowo jeden) w kablu sieciowym.

Jeśli fizyczne rozłączenie powoduje inne zachowanie, możesz podłączyć komputer do taniego koncentratora i umieścić wspomniany wyżej przełącznik między koncentratorem a siecią główną.

- EDYCJA - W wielu przypadkach połączenie sieciowe będzie działać, dopóki nie dojdziesz do określonego punktu w programie, NASTĘPNIE będziesz chciał się rozłączyć, korzystając z jednej z wielu zaproponowanych sugestii.

Brad Bruce
źródło
0

Dla mnie najprostszym sposobem było dodanie trasy statycznej na routerze biurowym w oparciu o sieć docelową. Po prostu przekieruj ruch do jakiegoś niereagującego hosta (np. Twojego komputera), a otrzymasz limit czasu żądania.

Najlepszą rzeczą dla mnie było to, że statyczną trasą można zarządzać przez interfejs sieciowy i łatwo włączać / wyłączać.

Ivan Marjanovic
źródło
-1

Możesz spróbować połączyć się z jedną ze znanych witryn sieci Web na porcie, który może nie być dostępny z zewnątrz - na przykład 200. Większość zapór ogniowych działa w trybie DROP i zasymuluje dla ciebie limit czasu.

Dmitrij Chałatow
źródło