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!
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.
Stellen Sie eine Verbindung zu einer nicht routbaren IP-Adresse her, z. B. 10.255.255.1.
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).
Die folgende URL gibt immer ein Timeout an und kombiniert die besten Antworten von @Alexander und @ Emu (siehe oben):
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.
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.
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.
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.
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.
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.
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
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 ...
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.
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.
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.
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.
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.
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.
Stecken Sie Ihr Netzwerkkabel in einen Switch, der keine anderen Anschlüsse/Kabel hat. Das sollte imho funktionieren.
In der Vergangenheit habe ich ein paar Taktiken angewandt, um Netzwerkprobleme zu simulieren.
Mit einer dieser Ideen können Sie das gewünschte Szenario künstlich generieren
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).