wake-up-neo.net

Erstellen Sie künstlich einen Verbindungszeitüberschreitungsfehler

Ich hatte einen Fehler in unserer Software, der auftritt, wenn ich eine Verbindungszeitüberschreitung erhalte. Diese Fehler treten sehr selten auf (normalerweise, wenn meine Verbindung von unserem internen Netzwerk getrennt wird). Wie kann ich diese Art von Effekt künstlich erzeugen, damit ich unsere Software testen kann? 

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

Bearbeiten:

Ich habe versucht, einen nicht vorhandenen Host zu verwenden, und ich bekomme den Socket-Fehler:

WSAEINVAL (10022) Ungültiges Argument

Mein nächster Versuch bestand darin, den Vorschlag von Alexander zu verwenden, eine Verbindung zu einem anderen Port herzustellen, z. 81 (auf meinem eigenen Server allerdings). Das hat super funktioniert. Genau wie bei einer abgebrochenen Verbindung (60 Sekunden warten, dann Fehler). Vielen Dank!

246
Mark Ingram

Stellen Sie eine Verbindung zu einem vorhandenen Host her, aber zu einem Port, der von der Firewall blockiert wird, wodurch einfach TCP SYN-Pakete verworfen werden. Zum Beispiel www.google.com:81.

261
Alexander

Stellen Sie eine Verbindung zu einer nicht routbaren IP-Adresse her, z. B. 10.255.255.1.

391
emu

Wenn Sie sich auf einem Unix-Computer befinden, können Sie mit netcat eine Port-Überwachung starten:

nc -l 8099

Ändern Sie dann Ihren Dienst so, dass er normalerweise den Port anruft, z. http: // localhost: 8099/einige/sort/of/endpoint

Dann öffnet Ihr Dienst die Verbindung und schreibt Daten, erhält jedoch keine Antwort und gibt Ihnen eine Lese-Zeitüberschreitung (statt abgelehnter Verbindung). 

32
Tom Chamberlain

Die folgende URL gibt immer ein Timeout an und kombiniert die besten Antworten von @Alexander und @ Emu (siehe oben):

http://example.com:81

Die Verwendung von example.com:81 ist eine Verbesserung der Antwort von Alexander, da example.com durch den DNS-Standard reserviert ist und daher im Gegensatz zu google.com:81 nicht erreichbar ist. Dies kann sich ändern, wenn Google dies mag. Da example.com als nicht erreichbar definiert ist, überschwemmen Sie nicht die Server von Google.

Ich würde sagen, es ist eine Verbesserung gegenüber @ emus Antwort, weil es viel einfacher ist, sich daran zu erinnern.

18
speedplane

Mit dem Python REPL können Sie beim Empfang von Daten eine Zeitüberschreitung simulieren (d. H. Nachdem eine Verbindung erfolgreich hergestellt wurde). Es wird nur eine Standard-Python-Installation benötigt.

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

Nun wartet er auf eine eingehende Verbindung. Verbinden Sie das, was Sie testen möchten, mit localhost:9000. Wenn Sie dies tun, akzeptiert Python die Verbindung und accept() gibt sie zurück. Wenn Sie keine Daten über clientsocket senden, sollte das Socket des Anrufers während der nächsten recv() abbrechen.

16

10.0.0.0, 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0, 192.168.255.255  

all diese sind nicht routbar. 

13
rajesh_kw

Ich möchte alle auf pathod aufmerksam machen.

Mit einer config (aus ihren Beispielen) von 200:[email protected]:dr erhalten Sie eine Verbindung, die zufällig unterbrochen wird.

9
amenthes

Wie wäre es mit einer Softwarelösung:

Installieren Sie den SSH-Server auf dem Anwendungsserver. Verwenden Sie anschließend den Socket-Tunnel, um eine Verbindung zwischen Ihrem lokalen Port und dem Remote-Port auf dem Anwendungsserver herzustellen. Sie können dazu die ssh-Clienttools verwenden. Lassen Sie Ihre Client-Anwendung stattdessen eine Verbindung zu Ihrem zugeordneten lokalen Port herstellen. Anschließend können Sie den Socket-Tunnel nach Belieben aufbrechen, um das Verbindungszeitlimit zu simulieren. 

8
stoneboy

Wenn Sie eine aktive Verbindung verwenden möchten, können Sie auch http://httpbin.org/delay/# verwenden, wobei # die Zeit ist, zu der der Server warten soll, bevor er eine Antwort sendet. Solange Ihr Timeout kürzer ist als die Verzögerung ... sollte der Effekt simuliert werden. Ich habe es erfolgreich mit dem Python-Requests-Paket verwendet.

Möglicherweise möchten Sie Ihre Anfrage ändern, wenn Sie sensible Daten senden.

4
RoHS4U

Es stehen Dienste zur Verfügung, mit denen Sie Origin-Timeouts künstlich erstellen können, indem Sie eine API aufrufen, in der Sie angeben, wie lange der Server für die Antwort braucht. Server Timeout für macgyver ist ein Beispiel für einen solchen Dienst.

Wenn Sie beispielsweise eine Anfrage testen möchten, deren Antwort 15 Sekunden dauert, würden Sie einfach eine Post-Anfrage an die Macgyver-API senden.

JSON-Nutzlast:

{
    "timeout_length": 15000
}

API-Antwort (nach 15 Sekunden):

{
    "response": "ok"
}

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

2
Timothy Moody

Möglicherweise installieren Sie den Microsoft Loopback-Treiber, der eine separate Schnittstelle für Sie erstellt. Dann können Sie sich mit einem Dienst von Ihnen (Ihrem eigenen Host) verbinden. In Netzwerkverbindungen können Sie dann eine solche Schnittstelle deaktivieren/aktivieren ...

1
Marcin Gil

Die Technik, die ich häufig verwende, um ein zufälliges Verbindungszeitlimit zu simulieren, ist die Verwendung der lokalen ssh-Portweiterleitung.

ssh -L 12345:realserver.com:80 localhost

Dadurch wird der Datenverkehr auf localhost: 12345 an realserver.com weitergeleitet: 80 Sie können dies auch auf Ihrem eigenen lokalen Computer in einer Schleife durchführen, wenn Sie möchten:

ssh -L 12345:localhost:8080 localhost

So können Sie Ihre Anwendung auf Ihren lokalen Host und Ihren benutzerdefinierten Port richten, und der Datenverkehr wird an den Ziel-Host-Port weitergeleitet. Dann können Sie diese Shell verlassen (möglicherweise müssen Sie auch nach dem Beenden die Tastenkombination Strg + C drücken), und die Weiterleitung wird abgebrochen, wodurch Ihre App einen Verbindungsverlust erleidet.

1
jdi

Trotzdem ist nicht ganz klar, welche der OP testen möchte: Es besteht ein Unterschied zwischen dem Versuch, eine Verbindung zu einem nicht vorhandenen Host/Port herzustellen, und einem Timeout einer bereits bestehenden Verbindung. Ich würde mit Rob gehen und warten, bis die Verbindung funktioniert und dann das Kabel ziehen. Oder - zur Vereinfachung - eine virtuelle Maschine als Testserver arbeiten (mit Bridged-Networking) und einfach die virtuelle Netzwerkschnittstelle deaktivieren, sobald die Verbindung hergestellt ist.

1
Dirk Taggesell

Ich hatte ähnliche Probleme wie Sie. Um das Softwareverhalten zu testen, habe ich das Netzwerkkabel gerade zur richtigen Zeit abgezogen. Ich musste einen Haltepunkt setzen, bevor ich das Kabel abziehen wollte. 

Wenn ich es noch einmal machen würde, würde ich einen Schalter (ein normalerweise geschlossener Push-Button-Schalter) in ein Netzwerkkabel einsetzen. 

Wenn die physische Trennung ein anderes Verhalten verursacht, können Sie Ihren Computer an einen billigen Hub anschließen und den oben erwähnten Switch zwischen Ihrem Hub und dem Hauptnetzwerk platzieren.

- BEARBEITEN --.__ In vielen Fällen benötigen Sie die Netzwerkverbindung, bis Sie an einem bestimmten Punkt in Ihrem Programm ankommen.

0
Brad Bruce

Am einfachsten wäre es, wenn Sie Ihre Verbindung mit CurrPorts trennen.

Um Ihren Ausnahmebehandlungscode zu testen, sollten Sie Ihren Netzwerkverbindungscode möglicherweise abstrahieren und einen Stub, Mock oder Dekorateur schreiben, der bei Bedarf Ausnahmen auslöst. Sie können dann die Fehlerbehandlungslogik der Anwendung testen, ohne das Netzwerk tatsächlich verwenden zu müssen.

0
Matt Howells

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

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

Sie können die Timeout-Dauer (bis zu 230 Sekunden) und den eventuellen Rückkehrcode konfigurieren.

0
AndyTheEntity

Der einfachste Weg für mich war das Hinzufügen einer statischen Route auf dem Office-Router basierend auf dem Zielnetzwerk. Leiten Sie einfach den Datenverkehr an einen nicht reagierenden Host (z. B. Ihren Computer), und Sie erhalten ein Timeout für die Anforderung.

Das Beste für mich war, dass die statische Route über das Webinterface verwaltet und problemlos aktiviert/deaktiviert werden kann.

0
Ivan Marjanovic

Stecken Sie Ihr Netzwerkkabel in einen Switch, der keine anderen Anschlüsse/Kabel hat. Das sollte imho funktionieren.

0
GHad

In der Vergangenheit habe ich ein paar Taktiken angewandt, um Netzwerkprobleme zu simulieren.

  1. Ziehen Sie das Netzwerkkabel heraus
  2. Schalten Sie den Switch aus (idealerweise mit dem Switch, an den der Computer angeschlossen ist und noch eingeschaltet ist, damit der Computer seine "Netzwerkverbindung" beibehält) zwischen Ihrem Computer und dem "Zielcomputer"
  3. Führen Sie auf dem Zielcomputer eine Firewall-Software aus, die empfangene Daten unbemerkt ablegt

Mit einer dieser Ideen können Sie das gewünschte Szenario künstlich generieren

0
Rob

Abhängig von der installierten/verfügbaren Firewall-Software sollten Sie in der Lage sein, den ausgehenden Port zu blockieren, und abhängig von der Einrichtung Ihrer Firewall sollte das Verbindungsanforderungspaket einfach gelöscht werden. Es erfolgt keine Verbindungsanfrage, keine Verbindung, Timeout. Dies würde wahrscheinlich besser funktionieren, wenn es auf Router-Ebene implementiert würde (sie neigen dazu, Pakete zu löschen, anstatt Resets zu senden, oder was auch immer die Entsprechung für die Situation ist).

0