Créer artificiellement une erreur de délai de connexion
J'ai eu un bogue dans le logiciel qui se produit lorsque je reçois un délai d'attente de connexion. Ces erreurs sont très rares (généralement, quand ma connexion est perdu par notre réseau interne). Comment puis-je générer ce genre d'effet artificiellement afin que je puisse tester notre logiciel?
Si elle concerne l'application est écrite en C++/MFC à l'aide de CAsyncSocket classes.
Edit:
J'ai essayé à l'aide d'un inexistante hôte, et j'obtiens l'erreur de socket:
WSAEINVAL (10022) Invalid argument
Ma prochaine tentative a été d'utiliser Alexanderla suggestion de la connexion à un port différent, par exemple, 81 (sur mon propre serveur mais). Qui a très bien fonctionné. Exactement la même que la perte de la connexion (60 secondes d'attente, puis d'erreur). Merci!!!!
- Salut Marc, j'ai essayé la solution de travailler pour vous, mais ce que je reçois est #503 (Service Indisponible.). N'est-ce pas devrait être l'un de ces, #504 (Gateway Timeout), #599 (connexion Réseau erreur de dépassement de délai), #598 (Réseau de lecture erreur de dépassement de délai).
Vous devez vous connecter pour publier un commentaire.
Se connecter à un hôte, mais à un port est bloqué par le pare-feu qui tout simplement gouttes TCP des paquets SYN. Par exemple, http://www.google.com:81.
Se connecter à une adresse IP non routable, comme 10.255.255.1.
urllib
, ce sera le retour d'un "No route to host' exception. Pour info10.0.0.0
et10.255.255.255
tiré un EACCES l'erreur plutôt que d'expirer.10.255.255.1
,172.16.0.0
,172.31.255.255
,192.168.0.0
, et192.168.255.255
ne timeout, cependant.Si vous êtes sur une machine unix, vous pouvez commencer à un port d'écoute en utilisant netcat:
Ensuite, modifiez-vous le service d'appel en ce qu'il fait habituellement à ce port par exemple http://localhost:8099/some/sort/of/endpoint
Ensuite, votre service sera ouvert à la connexion et écrire des données, mais n'obtiendrez jamais de réponse, et ainsi de vous donner une Lecture Temps (plutôt que la Connexion Refusée)
ssh alanse@localhost -p 8099
, ça ressemble à ça le fait.kill -STOP <pid>
(ou tout simplement CTRL-Z sans mettre en arrière-plan). Le système agit comme si le serveur était en cours d'exécution, mais d'attendre pour que le serveur accepte la connexion, résultant dans un délai d'attente de connexion (errno 110).L'URL suivante donne toujours un délai d'attente, et combine le meilleur de @Alexandre et @Uem réponses ci-dessus:
http://example.com:81
À l'aide de
example.com:81
est une amélioration de Alexander répondre parce que example.com est réservé par la norme DNS, de sorte qu'il sera toujours inaccessible, à la différence degoogle.com:81
, qui peut changer si Google se sent comme il. Aussi, parce queexample.com
est défini pour être inaccessible, vous ne serez pas inonder les serveurs de Google.Je dirais que c'est une amélioration par rapport à @ume de réponse parce qu'il est beaucoup plus facile à retenir.
example.com
résoudre à 93.184.216.34, et en fait il fait une courte HTML expliquant que c'est un exemple de domaine... le port 81 ne fonctionne toujours pas répondre.Vous pouvez utiliser le Python REPL à simuler un délai d'attente lors de la réception de données (c'est à dire une fois qu'une connexion a été établie avec succès). Rien d'autre qu'une installation standard de Python est nécessaire.
Maintenant, il attend une connexion entrante. Connectez tout ce que vous voulez tester sur
localhost:9000
. Lorsque vous le faites, Python accepte la connexion etaccept()
sera de retour il. À moins que vous envoyez des données à travers leclientsocket
, l'appelant socket doit expirer au cours de la prochainerecv()
.s.listen(5)
avants.accept()
?while True:
boucle, et qui semble faire un joli durable timeout-ing destination de frapper pour les tests.Tous ces non-routable.
10.0.0.0
et10.255.255.255
tiré un EACCES l'erreur plutôt que d'expirer.10.255.255.1
,172.16.0.0
,172.31.255.255
,192.168.0.0
, et192.168.255.255
ne timeout, cependant.Je tiens à souligner l'attention de tous à pathod
Avec une config (prises à partir de leurs exemples) de
200:b@100:dr
vous aurez une connexion hasard des gouttes.Comment sur une solution logicielle:
Installer le serveur SSH sur le serveur d'applications. Ensuite, l'utilisation de socket tunnel de créer un lien entre votre port local et le port distant sur le serveur d'applications. Vous pouvez utiliser un client ssh outils pour le faire. Demandez à votre client de l'application de se connecter à votre mappé port local à la place. Ensuite, vous pouvez briser le socket tunnel à la volonté de simuler le délai d'attente de connexion.
Si vous souhaitez utiliser une connexion active, vous pouvez également utiliser http://httpbin.org/delay/#, où # est le temps que vous voulez leur serveur doit attendre avant d'envoyer une réponse. Tant que votre délai d'attente est plus court que le délai doit simuler l'effet. J'ai utilisé avec succès avec le python demandes paquet.
Vous souhaiterez peut-être modifier votre demande si vous êtes d'envoyer quoi que ce soit sensible - aucune idée de ce qui se passe pour les données envoyées à eux.
Il existe des services qui vous permettent de créer artificiellement origine délais d'attente par l'appel d'une API dans laquelle vous spécifiez combien de temps le serveur va prendre pour y répondre. Délai d'expiration du serveur sur macgyver est un exemple d'un tel service.
Par exemple, si vous avez envie de tester une demande qui prend 15 secondes pour répondre il vous suffit de faire une requête post vers le macgyver de l'API.
JSON Charge utile:
API de Réponse (Après 15 secondes):
Délai d'expiration du serveur programme sur macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
Vous pouvez installer Microsoft Loopback pilote qui permettra de créer une interface distincte pour vous. Ensuite vous pourrez vous connecter à certains services de la vôtre (votre hôte). Puis, dans les Connexions Réseau, vous pouvez activer/désactiver cette interface...
Malgré qu'il n'est pas complètement clair qui un que l'OP veut tester: il y a une différence entre la tente d'établir une connexion à un non-existant hôte/port et un délai d'attente de connexions déjà existantes. Je voudrais aller avec Rob et attendre jusqu'à ce que la connexion fonctionne, puis tirez sur le câble. Ou - pour plus de commodité - avoir une machine virtuelle de travail que le serveur de test (avec mise en réseau pontée) et il suffit de désactiver l'interface réseau virtuelle, une fois que la connexion est établie.
La technique que j'utilise souvent pour simuler de façon aléatoire un délai d'attente de connexion est d'utiliser ssh local de la redirection de port.
Cela permettra d'acheminer le trafic sur localhost:12345 pour realserver.com:80
Vous pouvez faire une boucle autour de votre propre machine ainsi, si vous le souhaitez:
De sorte que vous pouvez pointer votre candidature à localhost et le port personnalisé, et la circulation seront acheminés à la cible de l'hôte:port. Ensuite, vous pouvez sortir de cette coquille (vous pouvez aussi avoir besoin de ctrl+c le shell après la sortie) et il va tuer le transfert qui provoque votre application pour voir une perte de connexion.
Branchez votre câble réseau sur un interrupteur qui n'a pas d'autre connexion/câbles. Qui devrait à mon humble avis.
Il ya un couple de stratégies que j'ai utilisé dans le passé pour simuler des problèmes de réseau;
L'une de ces idées peut vous donner quelques moyens de le crane de générer le scénario que vous souhaitez
En fonction de ce pare-feu logiciel que vous avez installé et disponible, vous devriez être en mesure de bloquer le port de départ et selon la façon dont votre pare-feu est configuré, il faut juste supprimer la demande de connexion de paquets. Pas de demande de connexion, pas de connexion, délai d'attente s'ensuit. Ce serait probablement plus efficace si elle était mise en œuvre à un routeur de niveau (ils ont tendance à rejeter les paquets au lieu de l'envoi de resets, ou quel que soit l'équivalent de la situation), mais il est lié à un logiciel qui ferait l'affaire.
La chose la plus simple serait de déposer votre connexion à l'aide de CurrPorts.
Toutefois, afin d'unité de tester votre code de gestion des exceptions, peut-être vous devriez envisager l'abstraction de votre connexion réseau de code, et écrire une souche, se moquer ou le décorateur qui lève des exceptions à la demande. Vous serez alors en mesure de tester l'application logique de gestion des erreurs sans avoir à utiliser le réseau.
recv()
à échouer immédiatement), mais ne pouvait pas trouver un moyen de simuler un délai d'attente (c'est à dire que plus de données sont transférés, mais la connexion reste ouverte).J'ai eu des problèmes dans le même sens que vous. Afin de tester le comportement du logiciel, j'ai juste débranché le câble réseau au moment opportun. J'ai dû mettre un point de rupture juste avant que je voulais, débranchez le câble.
Si je devais le refaire, je mettrais un interrupteur a poussoir momentané normalement fermé bouton) dans un câble réseau.
Si le physique débranchez les causes d'un comportement différent, vous pouvez connecter votre ordinateur à un bas prix moyeu et mettre l'interrupteur je l'ai mentionné ci-dessus entre le concentrateur et le réseau principal.
-- EDIT --
Dans de nombreux cas, vous aurez besoin de la connexion réseau de travail jusqu'à ce que vous arrivez à un certain point dans votre programme, vous aurez envie de vous déconnecter à l'aide de l'une des nombreuses suggestions.
Pour moi la façon la plus simple est l'ajout de la route statique sur le routeur du bureau basé sur le réseau de destination. Juste acheminer le trafic vers certains qui ne répond pas de l'hôte (par exemple, votre ordinateur) et vous obtiendrez expiration du délai de demande.
Meilleure chose pour moi est que la route statique peut être géré via une interface web et activé/désactivé facilement.
Beaucoup de bonnes réponses, mais la solution la plus propre semble être ce service
http://httpstat.us/504?sleep=60000
Vous pouvez configurer le délai d'expiration de la durée (jusqu'à 230 secondes) et le retour éventuel code.
Vous pouvez essayer de vous connecter à l'un des sites Web bien connus sur un port qui peuvent ne pas être disponibles à partir de l'extérieur - 200 par exemple. La plupart des pare-feu de travail en BAISSE de mode et il permettra de simuler un délai d'attente pour vous.