Ich habe einen Fehler in unserer Software, der auftritt, wenn ich ein Verbindungszeitlimit erhalte. Diese Fehler sind sehr selten (normalerweise, wenn meine Verbindung von unserem internen Netzwerk getrennt wird). Wie kann ich diese Art von Effekt künstlich erzeugen, um unsere Software zu testen?
Wenn es darauf ankommt, wird die App mithilfe von CAsyncSocket-Klassen in C ++ / MFC geschrieben.
Bearbeiten:
Ich habe versucht, einen nicht vorhandenen Host zu verwenden, und erhalte den Socket-Fehler:
WSAEINVAL (10022) Ungültiges Argument
Mein nächster Versuch war, Alexanders Vorschlag zu verwenden, eine Verbindung zu einem anderen Port herzustellen, z. B. 81 (allerdings auf meinem eigenen Server). Das hat super geklappt. Genau das gleiche wie eine unterbrochene Verbindung (60 Sekunden warten, dann Fehler). Danke dir!
quelle
Antworten:
Stellen Sie eine Verbindung zu einem vorhandenen Host her, aber zu einem Port, der von der Firewall blockiert wird, die einfach TCP-SYN-Pakete verwirft. Zum Beispiel www.google.com:81.
quelle
Stellen Sie eine Verbindung zu einer nicht routbaren IP-Adresse her, z. B. 10.255.255.1.
quelle
urllib
Ausnahme "Keine Route zum Host" zurückgegeben. Zu Ihrer InformationWenn Sie sich auf einem Unix-Computer befinden, können Sie mit netcat einen Port starten, der überwacht:
Ändern Sie dann Ihren Dienst so, dass er alles aufruft, was er normalerweise an diesem Port tut, z. B. http: // localhost: 8099 / some / sort / of / endpoint
Dann öffnet Ihr Dienst die Verbindung und schreibt Daten, erhält jedoch nie eine Antwort und gibt Ihnen eine Lesezeitüberschreitung (anstatt Verbindung verweigert).
quelle
ssh alanse@localhost -p 8099
eingebe, sieht es so aus.kill -STOP <pid>
(oder drücken Sie einfach STRG-Z, ohne Hintergrund zu setzen). Das System verhält sich so, als würde der Server ausgeführt, wartet jedoch darauf, dass der Server die Verbindung akzeptiert, was zu einem Verbindungszeitlimit führt (Errno 110).Die folgende URL gibt immer eine Zeitüberschreitung an und kombiniert die besten Antworten von @Alexander und @ Emu oben:
http://example.com:81
Die Verwendung
example.com:81
ist eine Verbesserung gegenüber Alexanders Antwort, da example.com vom DNS-Standard reserviert ist und daher im Gegensatz zugoogle.com:81
Google immer nicht erreichbar ist. Dies kann sich ändern, wenn Google dies wünscht. Daexample.com
die Definition nicht erreichbar ist, werden die Server von Google nicht überflutet.Ich würde sagen, es ist eine Verbesserung gegenüber der Antwort von @ emu, weil es viel einfacher ist, sich daran zu erinnern.
quelle
example.com
Auflösung in 93.184.216.34 angezeigt, und es wird ein kurzer HTML-Code bereitgestellt, der erklärt, dass es sich um eine Beispieldomäne handelt. Port 81 antwortet immer noch nicht.httpstat.us
Erwägen Sie die Verwendung als @AndyTheEntity, auf die in seiner Antwort hingewiesen wird.example.com
ist keine kommerzielle Domain, sondern einer der wenigen Domainnamen, die ausdrücklich als unbrauchbar angegeben werden. Niemand kann besitzenexample.com
und DNS-Router wissen, dass sie niemals an eine echte Adresse weitergeleitet werden. Es kostet also niemanden Serverzeit, es ist nichts Falsches daran, es zu benutzenexample.com
. Hinter der Domain befindet sich eine Infrastruktur, daher kostet jede Anfrage das IANA-Geld. Auf die zulässige Verwendung wird in RFC 2606 und RFC 6761 verwiesen. Es steht Ihnen nicht frei, die Domänen für einen beliebigen Zweck zu verwenden, z. B.flodding
anstelle eines anderen Servers, wie Sie bereits erwähnt haben. Ihre Behauptung,example.com is defined to be unreachable
die falsch ist, ist erreichbar. Port 81 ist derzeit nicht erreichbar, aber wo soll dies in Zukunft garantiert werden?.test
, anstelle einer Top-Level-Domain eine Domain zu verwenden,example.com
aber diese Domains wurden eindeutig für diesen Zweck eingerichtet. Ja, es könnte die IANA ein bisschen Geld kosten, aber dies ist ein Service, den sie anbieten. Unsere DNS-Gebühren zahlen dafür.Viele gute Antworten, aber die sauberste Lösung scheint dieser Service zu sein
http://httpstat.us/504?sleep=60000
Sie können die Timeout-Dauer (bis zu 230 Sekunden) und den eventuellen Rückkehrcode konfigurieren.
quelle
Mit Python REPL können Sie eine Zeitüberschreitung beim Empfang von Daten simulieren (dh nachdem eine Verbindung erfolgreich hergestellt wurde). Es wird nur eine Standard-Python-Installation benötigt.
Jetzt wartet es auf eine eingehende Verbindung. Verbinden Sie alles, was Sie testen möchten
localhost:9000
. Wenn Sie dies tun, akzeptiert Python die Verbindung undaccept()
gibt sie zurück. Sofern Sie keine Daten über das sendenclientsocket
, sollte der Socket des Anrufers während des nächsten Zeitlimits ablaufenrecv()
.quelle
s.listen(5)
vorhers.accept()
?while True:
Schleife zu setzen, und das scheint ein schönes, dauerhaftes Timeout-Ziel zu sein, das zum Testen getroffen werden kann.Alle diese sind nicht routingfähig.
quelle
10.0.0.0
und10.255.255.255
einen EACCES-Fehler ausgelöst, anstatt eine Zeitüberschreitung zu verursachen.10.255.255.1
,172.16.0.0
,172.31.255.255
,192.168.0.0
, Und192.168.255.255
tat Timeout jedoch.Ich möchte die Aufmerksamkeit aller auf Pathod lenken
Mit einer Konfiguration (aus den Beispielen entnommen) erhalten
200:b@100:dr
Sie eine Verbindung, die zufällig unterbrochen wird.quelle
Wie wäre es mit einer Softwarelösung:
Installieren Sie den SSH-Server auf dem Anwendungsserver. Verwenden Sie dann den Socket-Tunnel, um eine Verbindung zwischen Ihrem lokalen Port und dem Remote-Port auf dem Anwendungsserver herzustellen. Sie können dazu ssh-Client-Tools 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 unterbrechen, um das Verbindungszeitlimit zu simulieren.
quelle
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 eine Antwort gesendet wird. Solange Ihr Timeout kürzer als die Verzögerung ist ... sollte der Effekt simuliert werden. Ich habe es erfolgreich mit dem Python-Anforderungspaket verwendet.
Möglicherweise möchten Sie Ihre Anfrage ändern, wenn Sie vertrauliche Informationen senden - keine Ahnung, was mit den an sie gesendeten Daten geschieht.
quelle
Es stehen Dienste zur Verfügung, mit denen Sie künstlich Zeitüberschreitungen beim Ursprung erstellen können, indem Sie eine API aufrufen, in der Sie angeben, wie lange der Server für die Antwort benötigt. Das Server-Timeout unter Macgyver ist ein Beispiel für einen solchen Dienst.
Wenn Sie beispielsweise eine Anfrage testen möchten, deren Beantwortung 15 Sekunden dauert, stellen Sie einfach eine Post-Anfrage an die Macgyver-API.
JSON-Nutzlast:
API-Antwort (nach 15 Sekunden):
Server Timeout-Programm auf Macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
quelle
Möglicherweise installieren Sie den Microsoft Loopback-Treiber, der eine separate Schnittstelle für Sie erstellt. Dann können Sie eine Verbindung zu einem Ihrer Dienste (Ihrem eigenen Host) herstellen. Dann können Sie in Netzwerkverbindungen eine solche Schnittstelle deaktivieren / aktivieren ...
quelle
Obwohl nicht ganz klar ist, welche das OP testen möchte: Es gibt einen Unterschied zwischen dem Versuch, eine Verbindung zu einem nicht vorhandenen Host / Port herzustellen, und einem Timeout einer bereits hergestellten Verbindung. Ich würde mit Rob gehen und warten, bis die Verbindung funktioniert und dann das Kabel ziehen. Oder lassen Sie der Einfachheit halber eine virtuelle Maschine als Testserver (mit überbrücktem Netzwerk) arbeiten und die virtuelle Netzwerkschnittstelle einfach deaktivieren, sobald die Verbindung hergestellt ist.
quelle
Die Technik, die ich häufig verwende, um ein zufälliges Verbindungszeitlimit zu simulieren, ist die Verwendung der lokalen ssh-Portweiterleitung.
Dadurch wird der Datenverkehr auf localhost: 12345 an realserver.com:80 weitergeleitet. Sie können dies auch auf Ihrem eigenen lokalen Computer durchlaufen, wenn Sie möchten:
Sie können Ihre Anwendung also auf Ihren lokalen Host und Ihren benutzerdefinierten Port verweisen, und der Datenverkehr wird an den Zielhost weitergeleitet: port. Anschließend können Sie diese Shell verlassen (möglicherweise müssen Sie die Shell nach dem Beenden auch mit Strg + C drücken), wodurch die Weiterleitung abgebrochen wird und Ihre App einen Verbindungsverlust feststellt.
quelle
Stecken Sie Ihr Netzwerkkabel in einen Switch, der keine anderen Verbindungen / Kabel hat. Das sollte imho funktionieren.
quelle
Es gibt einige Taktiken, mit denen ich in der Vergangenheit Netzwerkprobleme simuliert habe.
Eine dieser Ideen gibt Ihnen möglicherweise die Möglichkeit, das von Ihnen benötigte Szenario künstlich zu generieren
quelle
Abhängig davon, welche Firewall-Software Sie installiert / verfügbar haben, sollten Sie in der Lage sein, den ausgehenden Port zu blockieren, und je nachdem, wie Ihre Firewall eingerichtet ist, sollte das Verbindungsanforderungspaket einfach verworfen werden. Es erfolgt keine Verbindungsanforderung, keine Verbindung, Zeitüberschreitung. Dies würde wahrscheinlich besser funktionieren, wenn es auf Routerebene implementiert würde (sie neigen dazu, Pakete zu verwerfen, anstatt Resets zu senden, oder was auch immer das Äquivalent für die Situation ist), aber es muss ein Softwarepaket geben, das auch den Trick macht.
quelle
Am einfachsten ist es, die Verbindung mit CurrPorts zu trennen .
Um Ihren Code für die Ausnahmebehandlung zu testen, sollten Sie möglicherweise in Betracht ziehen, Ihren Netzwerkverbindungscode zu abstrahieren und einen Stub, Mock oder Decorator zu schreiben, der bei Bedarf Ausnahmen auslöst. Sie können dann die Anwendungsfehlerbehandlungslogik testen, ohne das Netzwerk tatsächlich verwenden zu müssen.
quelle
recv()
sofort fehlschlägt), aber keine Möglichkeit finden, eine Zeitüberschreitung zu simulieren (dh es werden keine Daten mehr übertragen, aber die Verbindung bleibt offen).Ich hatte Probleme in der gleichen Richtung wie Sie. Um das Softwareverhalten zu testen, habe ich das Netzwerkkabel zum richtigen Zeitpunkt 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 (einen normalerweise geschlossenen momentanen Druckknopf) in ein Netzwerkkabel stecken.
Wenn die physische Trennung ein anderes Verhalten verursacht, können Sie Ihren Computer an einen billigen Hub anschließen und den oben genannten Switch zwischen Ihren Hub und das Hauptnetzwerk stellen.
- BEARBEITEN - In vielen Fällen muss die Netzwerkverbindung funktionieren, bis Sie zu einem bestimmten Punkt in Ihrem Programm gelangen. DANN möchten Sie die Verbindung mit einem der vielen angebotenen Vorschläge trennen.
quelle
Für mich war es am einfachsten, eine statische Route auf dem Office-Router basierend auf dem Zielnetzwerk hinzuzufügen. Leiten Sie den Datenverkehr einfach an einen nicht reagierenden Host (z. B. Ihren Computer) weiter, und Sie erhalten ein Zeitlimit für die Anforderung.
Das Beste für mich war, dass die statische Route über die Weboberfläche verwaltet und einfach aktiviert / deaktiviert werden kann.
quelle
Sie können versuchen, eine Verbindung zu einer bekannten Website über einen Port herzustellen, der möglicherweise nicht von außen verfügbar ist, z. B. 200. Die meisten Firewalls arbeiten im DROP-Modus und simulieren eine Zeitüberschreitung für Sie.
quelle