Frage

Ich habe einen Fehler in unserer Software hat die auftritt, wenn ich eine Verbindung Timeout erhalten. Diese Fehler sind sehr selten (in der Regel, wenn meine Verbindung mit unserem internen Netzwerk runterfällt). Wie kann ich diese Art der Wirkung künstlich erzeugen, damit ich unsere Software testen kann?

Wenn es darauf ankommt die App in C ++ geschrieben ist / MFC CAsyncSocket-Klassen.

Edit:

Ich habe versucht, einen nicht vorhandenen Host verwenden, und ich erhalte die Socket-Fehler:

  

WSAEINVAL (10022) Invalid argument

Mein nächster Versuch war zu Alexander 's Vorschlag, eine Verbindung zu einem anderen Port zu verwenden, z.B. 81 (auf meinem eigenen Server obwohl). Das hat super funktioniert. Genau das gleiche wie eine unterbrochene Verbindung (60 Sekunden warten, dann Fehler). Vielen Dank!

War es hilfreich?

Lösung

Eine Verbindung mit einem bestehenden Host aber zu einem Port, der von der Firewall blockiert wird, die einfach TCP SYN-Pakete fällt. Zum Beispiel www.google.com:81.

Andere Tipps

Eine Verbindung mit einer nicht-routbare IP-Adresse, wie 10.255.255.1.

Wenn Sie auf einem UNIX-Rechner sind, können Sie einen Port beginnen netcat hören:

nc -l 8099

Dann ändern Sie den Service anrufen, was es in der Regel an diesen Port tut z.B. http: // localhost: 8099 / some / Art / von / Endpunkt

Dann wird Ihr Dienst die Verbindung öffnen und Daten schreiben, aber nie eine Antwort erhalten, und so werden Sie eine Read Time Out (statt Verbindung Refused)

Die folgende URL gibt immer einen Timeout, und kombiniert das Beste aus @Alexander und @ Emu die Antworten von oben:

http://example.com:81

example.com:81 Verwendung ist eine Verbesserung gegenüber Alexanders Antwort, weil example.com durch den DNS-Standard reserviert ist, so wird es immer unerreichbar sein, im Gegensatz zu google.com:81, das kann sich ändern, wenn Google wie es sich anfühlt. Auch, weil example.com definiert ist, nicht erreichbar zu sein, werden Sie nicht überschwemmen die Google-Server.

Ich würde sagen, es ist eine Verbesserung gegenüber @ emu Antwort, weil es viel leichter zu merken ist.

Sie können den Python REPL verwenden, um ein Timeout zu simulieren, während Empfangen von Daten (das heißt, nachdem eine Verbindung erfolgreich hergestellt wurde). Nichts anderes als eine Standard-Python-Installation erforderlich.

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()

Jetzt wartet er auf eine eingehende Verbindung. Schließen Sie, was Sie zu localhost:9000 testen möchten. Wenn Sie das tun, akzeptieren Python die Verbindung und accept() wird es zurück. Sofern Sie keine Daten über die clientsocket senden, die Buchse des Anrufers sollte während der nächsten recv() Timeout.

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

Alle diese sind nicht routbar.

würde Ich mag alle Aufmerksamkeit auf verweisen auf pathod

Mit einer Config (aus ihren Beispielen) von 200:b@100:dr Sie eine Verbindung erhalten, die zufällig fällt.

Wie über eine Software-Lösung:

Installieren SSH-Server auf dem Anwendungsserver. verwendet Buchse Tunnel dann eine Verbindung zwischen dem lokal Port und dem Remote-Port auf dem Anwendungsserver zu erstellen. Sie können SSH-Client-Tools verwenden, dies zu tun. Haben Sie Ihre Client-Anwendung, anstatt zu Ihrem zugeordneten lokal Port anschließen. Dann können Sie den Socket-Tunnel nach Belieben brechen die Verbindungszeit zu simulieren.

Wenn Sie eine aktive Verbindung verwenden Sie auch http://httpbin.org/delay/# , wobei # die Zeit ist, dass Sie ihre Server vor dem Senden eine Antwort warten soll. Solange Ihr Timeout kürzer ist als die Verzögerung ... sollte den Effekt simulieren. Ich habe es erfolgreich mit dem Python-Anfragen Paket.

Sie möchten Ihre Anfrage ändern, wenn Sie empfindlich sind alles andere zu senden -. Keine Ahnung, was passiert mit den Daten an sie gesendet

Es gibt Dienste zur Verfügung, die es Ihnen ermöglichen, künstlich Herkunft Timeouts zu erstellen, indem Sie einen API-Aufruf geben Sie an, wie lange der Server zu reagieren nehmen. Server Timeout auf macgyver ist ein Beispiel für einen solchen Dienst.

Zum Beispiel, wenn man wollte eine Anfrage testen, die 15 Sekunden dauert Sie reagieren würde einfach einen Beitrag Anfrage an die macgyver API machen.

JSON Nutzlast:

{
    "timeout_length": 15000
}

API Response (nach 15 Sekunden):

{
    "response": "ok"
}

Server Timeout Programm auf macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

Sie können Microsoft Loopback-Treiber installieren, die eine separate Schnittstelle für Sie erstellen. Dann können Sie auf es bis zu einem gewissen Service von Ihnen (Ihrem eigenen Host) verbinden. Dann in Netzwerkverbindungen können Sie deaktivieren / aktivieren solche Schnittstelle ...

Obwohl es nicht ganz klar ist, welches das OP will Test: es gibt einen Unterschied zwischen eine Verbindung zu einem nicht vorhandenen Host / Port versucht, und ein Timeout einer bereits bestehenden Verbindung. Ich würde mit Rob gehen und warten, bis die Verbindung funktioniert und dann das Kabel ziehen. Oder - der Einfachheit halber - haben eine virtuelle Maschine als Testserver arbeiten (mit Bridged Networking) und Deaktivieren nur die virtuelle Netzwerkschnittstelle, sobald die Verbindung hergestellt ist

.

Die Technik, die ich häufig eine zufällige Verbindung Timeout zu simulieren verwenden ist ssh lokal Port zu verwenden.

ssh -L 12345:realserver.com:80 localhost

Dies wird der Verkehr auf localhost weiter: 12345 realserver.com:80 Sie können diese um Schleife auch in Ihrem eigenen lokalen Rechner, wenn Sie wollen:

ssh -L 12345:localhost:8080 localhost

So können Sie Ihre Anwendung auf Ihrem lokalen Host und benutzerdefiniert Port verweisen können, und der Verkehr wird auf die Ziel-Host erhalten geleitet: Port. Dann können Sie verlassen aus dieser Schale (Sie können auch auf ctrl benötigen + c der Shell nach Beenden), und es wird die Weiterleitung töten, die Ihre Anwendung verursacht einen Verbindungsverlust zu sehen.

Stecken Sie das Netzwerkkabel in einen Schalter, der keine andere Verbindung / Kabel hat. Das sollte imho arbeiten.

Es gibt ein paar Taktik ich in der Vergangenheit verwendet haben Netzwerkprobleme zu simulieren;

  1. das Netzwerkkabel ziehen
  2. Schalten Sie
  3. den Schalter (idealerweise mit dem Schalter, dass der Computer in den noch eingesteckt wird mit Strom versorgt wird, so dass die Maschine zum Thema „Netzwerkverbindung“ hält) zwischen Ihrem Rechner und dem „Ziel“ Maschine
  4. Führen Sie eine Firewall-Software auf dem Zielcomputer die lautlos Tropfen empfangenen Daten

Eine dieser Ideen könnten Sie einige Mittel künstlich zu erzeugen das Szenario müssen Sie

Je nachdem, welche Firewall-Software installiert haben / zur Verfügung, sollten Sie in der Lage sein, den Ausgang-Port zu blockieren und je nachdem, wie Sie Ihre Firewall-Setup sollte nur das Verbindungsanforderungspaket fallen. Keine Verbindung Anfrage, keine Verbindung, Timeout erfolgt. Dies würde wahrscheinlich besser funktionieren, wenn es an einer Router-Ebene implementiert wurde (sie neigen dazu, Pakete fallen zu lassen, anstatt Resets zu senden, oder was auch immer die äquivalent für die Situation ist), aber es ist verpflichtet, ein Software-Paket zu sein, die zu dem Trick tun würden.

Die einfachste Sache wäre, um Ihre Verbindung zu fallen mit CurrPorts .

Um jedoch zu Einheit testen Sie Ihren Code Ausnahmebehandlung, vielleicht sollten Sie überlegen, Ihre Netzwerkverbindung Code abstrahiert und schreiben ein Stummel, Mock oder Dekorateur, die Ausnahmen auf Anfrage wirft. Sie werden dann in der Lage sein, die Anwendung Fehlerbehandlungslogik zu testen, ohne tatsächlich das Netzwerk nutzen.

Ich hatte Probleme auf der gleichen Linie Sie tun. Um das Verhalten der Software zu testen, ich unplugged nur das Netzwerkkabel an der entsprechenden Zeit. Ich hatte einen Knickpunkt rechts zu setzen, bevor ich das Kabel ziehen wollte.

Wenn ich es wurde wieder tun, ich einen Schalter setzen würde (ein normalerweise geschlossen momentane Drücks) in einem Netzwerkkabel.

Wenn die physikalische Trenn ein anderes Verhalten führt, wenn Sie Ihren Computer zu einem günstigen Hub anschließen könnten und legen den Schalter ich oben zwischen Ihrem Hub erwähnt und dem Hauptnetz.

- EDIT - In vielen Fällen werden Sie die Netzwerkverbindung benötigen arbeiten, bis Sie zu einem bestimmten Punkt in Ihrem Programm bekommen, dann werden Sie angeboten mit einer der vielen Vorschläge trennen möchten.

Für mich einfachste Weg, wurde das Hinzufügen statische Route auf Büro-Router basierend auf Zielnetz. Nur Datenverkehr zu einem gewissen unempfänglich Host (zum Beispiel Ihres Computer) und Sie werden Anfrage Timeout erhalten.

Das Beste, was für mich war, dass statische Route über Web-Interface verwaltet werden kann und aktiviert / deaktiviert leicht.

Viele gute Antworten, aber die sauberste Lösung scheint zu sein, dieser Service

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

Sie können die Timeout-Zeit konfigurieren (bis zu 230 Sekunden) und eventuelle Rückkehr-Code.

Sie können versuchen, einen der bekannten Websites auf einem Port zu verbinden, das von außen nicht verfügbar sein kann - 200 zum Beispiel. Die meisten Firewalls arbeiten in DROP-Modus und es wird ein Timeout für Sie simulieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top