J'ai eu un bogue dans notre logiciel qui se produit lorsque je reçois un délai de connexion. Ces erreurs sont très rares (généralement lorsque ma connexion est interrompue par notre réseau interne). Comment générer artificiellement ce type d'effet pour tester notre logiciel?
Si cela est important, l'application est écrite en C ++ / MFC à l'aide des classes CAsyncSocket.
Éditer:
J'ai essayé d'utiliser un hôte inexistant et j'obtiens l'erreur de socket:
WSAEINVAL (10022) Argument non valide
Ma prochaine tentative a été d'utiliser la suggestion d' Alexander de se connecter à un autre port, par exemple 81 (sur mon propre serveur cependant). Cela a très bien fonctionné. Exactement la même chose qu'une connexion interrompue (60 secondes d'attente, puis erreur). Je vous remercie!
la source
Réponses:
Connectez-vous à un hôte existant mais à un port bloqué par le pare-feu qui supprime simplement les paquets TCP SYN. Par exemple, www.google.com:81.
la source
Connectez-vous à une adresse IP non routable, telle que 10.255.255.1.
la source
urllib
, cela renverra une exception «Aucune route vers l'hôte». Pour infoSi vous êtes sur une machine Unix, vous pouvez démarrer une écoute de port en utilisant netcat:
Ensuite, modifiez votre service pour appeler tout ce qu'il fait habituellement sur ce port, par exemple http: // localhost: 8099 / some / sort / of / endpoint
Ensuite, votre service ouvrira la connexion et écrira des données, mais n'obtiendra jamais de réponse, et vous donnera donc un délai de lecture (plutôt que la connexion refusée)
la source
ssh alanse@localhost -p 8099
, il semble que cela le fasse.kill -STOP <pid>
(ou simplement CTRL-Z sans le mettre en arrière-plan). Le système agira comme si le serveur était en cours d'exécution, mais attendez que le serveur accepte la connexion, ce qui entraîne un délai de connexion (errno 110).L'URL suivante donne toujours un délai d'expiration et combine le meilleur des réponses @Alexander et @ Emu ci-dessus:
http://example.com:81
L'utilisation
example.com:81
est une amélioration de la réponse d'Alexander car example.com est réservé par la norme DNS, il sera donc toujours inaccessible, contrairement àgoogle.com:81
ce qui peut changer si Google en a envie. De plus, comme ilexample.com
est défini comme inaccessible, vous n'inonderez pas les serveurs de Google.Je dirais que c'est une amélioration par rapport à la réponse de @ emu car c'est beaucoup plus facile à retenir.
la source
example.com
résolution de 93.184.216.34, et sert en fait un court HTML expliquant qu'il s'agit d'un exemple de domaine ... le port 81 ne répond toujours pas.httpstat.us
comme @AndyTheEntity a souligné dans sa réponse.example.com
n'est pas un domaine commercial, c'est l'un des rares noms de domaine qui est explicitement spécifié comme inutilisable. Personne ne peut posséderexample.com
et les routeurs DNS savent qu'il ne route jamais vers une adresse réelle. Donc, cela ne coûte du temps à personne, il n'y a rien de mal à l'utiliserexample.com
. Il y a une infrastructure derrière le domaine, donc chaque demande coûte de l'argent à l'IANA. L'utilisation autorisée est référencée dans les RFC 2606 et RFC 6761, vous n'êtes pas libre d'utiliser les domaines pour le but que vous aimez, commeflodding
eux au lieu d'un autre serveur, comme vous le mentionnez. Votre réclamation quiexample.com is defined to be unreachable
est incorrecte, elle est accessible. Le port 81 est inaccessible maintenant, mais où est-il défini pour être garanti à l'avenir?.test
domaine de premier niveau plutôt queexample.com
, mais ces domaines ont été clairement configurés à cet effet. Oui, cela pourrait coûter un peu d'argent à l'IANA, mais c'est un service qu'ils fournissent. Nos frais DNS le paient.Beaucoup de bonnes réponses mais la solution la plus propre semble être ce service
http://httpstat.us/504?sleep=60000
Vous pouvez configurer la durée de temporisation (jusqu'à 230 secondes) et le code retour éventuel.
la source
Vous pouvez utiliser Python REPL pour simuler un délai d'attente lors de la réception de données (c'est-à-dire après qu'une connexion a été établie avec succès). Rien d'autre qu'une installation Python standard n'est nécessaire.
Maintenant, il attend une connexion entrante. Connectez ce que vous voulez tester
localhost:9000
. Lorsque vous le faites, Python acceptera la connexion et laaccept()
renverra. Sauf si vous envoyez des données via leclientsocket
, la prise de l'appelant devrait expirer au cours de la prochainerecv()
.la source
s.listen(5)
avants.accept()
?while True:
boucle, et cela semble faire une belle destination de timeout à frapper pour les tests.Tous ces éléments ne sont pas routables.
la source
10.0.0.0
et ont10.255.255.255
déclenché une erreur EACCES plutôt que de se terminer.10.255.255.1
,172.16.0.0
,172.31.255.255
,192.168.0.0
Et a192.168.255.255
fait délai d' attente, cependant.Je voudrais attirer l'attention de tout le monde sur pathod
Avec une configuration (tirée de leurs exemples) de
200:b@100:dr
vous obtiendrez une connexion qui tombe aléatoirement.la source
Que diriez-vous d'une solution logicielle:
Installez le serveur SSH sur le serveur d'applications. Ensuite, utilisez le tunnel de socket pour créer un lien entre votre port local et le port distant sur le serveur d'applications. Pour ce faire, vous pouvez utiliser les outils client ssh. Demandez à votre application client de se connecter à votre port local mappé à la place. Ensuite, vous pouvez interrompre le tunnel de socket à volonté pour simuler le délai de connexion.
la source
Si vous souhaitez utiliser une connexion active, vous pouvez également utiliser http://httpbin.org/delay/# , où # est la durée pendant laquelle votre serveur doit attendre avant d'envoyer une réponse. Tant que votre délai d'attente est plus court que le délai ... devrait simuler l'effet. Je l'ai utilisé avec succès avec le paquet de requêtes python.
Vous voudrez peut-être modifier votre demande si vous envoyez quelque chose de sensible - aucune idée de ce qui arrive aux données qui leur sont envoyées.
la source
Il existe des services disponibles qui vous permettent de créer artificiellement des délais d'expiration d'origine en appelant une API dans laquelle vous spécifiez le délai de réponse du serveur. Le délai d'expiration du serveur sur macgyver est un exemple d'un tel service.
Par exemple, si vous souhaitez tester une demande qui prend 15 secondes pour répondre, vous devrez simplement envoyer une demande à l'API macgyver.
Charge utile JSON:
Réponse de l'API (après 15 secondes):
Programme d'expiration du serveur sur macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
la source
Vous pouvez installer le pilote Microsoft Loopback qui créera une interface distincte pour vous. Ensuite, vous pouvez vous y connecter à un de vos services (votre propre hôte). Ensuite, dans Connexions réseau, vous pouvez désactiver / activer une telle interface ...
la source
Bien qu'il ne soit pas complètement clair lequel l'OP veut tester: il y a une différence entre tenter une connexion à un hôte / port inexistant et un timeout d'une connexion déjà établie. J'irais avec Rob et j'attendrais que la connexion fonctionne, puis je tirerais le câble. Ou - pour plus de commodité - disposer d'une machine virtuelle fonctionnant comme serveur de test (avec mise en réseau pontée) et désactivant simplement l'interface réseau virtuelle une fois la connexion établie.
la source
La technique que j'utilise fréquemment pour simuler un délai de connexion aléatoire consiste à utiliser la redirection de port local ssh.
Cela transmettra le trafic sur localhost: 12345 à realserver.com:80 Vous pouvez également le boucler sur votre propre machine locale, si vous le souhaitez:
Ainsi, vous pouvez pointer votre application vers votre port local et votre port personnalisé, et le trafic sera acheminé vers l'hôte cible: port. Ensuite, vous pouvez quitter ce shell (vous devrez peut-être également ctrl + c le shell après avoir quitté) et cela tuera le transfert qui provoquera une perte de connexion pour votre application.
la source
Branchez votre câble réseau dans un commutateur qui n'a pas d'autre connexion / câbles. Cela devrait fonctionner à mon humble avis.
la source
Il y a quelques tactiques que j'ai utilisées dans le passé pour simuler des problèmes de mise en réseau;
L'une de ces idées pourrait vous donner des moyens de générer artificiellement le scénario dont vous avez besoin
la source
Selon le logiciel de pare-feu que vous avez installé / disponible, vous devriez pouvoir bloquer le port sortant et selon la configuration de votre pare-feu, il devrait simplement supprimer le paquet de demande de connexion. Aucune demande de connexion, aucune connexion, un délai d'attente s'ensuit. Cela fonctionnerait probablement mieux s'il était implémenté au niveau du routeur (ils ont tendance à laisser tomber les paquets au lieu d'envoyer des réinitialisations, ou quel que soit l'équivalent pour la situation), mais il y a forcément un package logiciel qui ferait l'affaire aussi.
la source
La chose la plus simple serait de supprimer votre connexion à l'aide de CurrPorts .
Cependant, afin de tester à l'unité votre code de gestion des exceptions, vous devriez peut-être envisager d'abstraire votre code de connexion réseau et écrire un talon, une maquette ou un décorateur qui lève des exceptions à la demande. Vous pourrez ensuite tester la logique de gestion des erreurs de l'application sans avoir à utiliser réellement le réseau.
la source
recv()
échec immédiat du prochain ), mais je n'ai pas pu trouver un moyen de simuler un délai d'expiration (c'est-à-dire qu'aucune autre donnée n'est transférée, mais la connexion reste ouverte).J'ai eu des problèmes comme vous. Afin de tester le comportement du logiciel, je viens de débrancher le câble réseau au moment approprié. J'ai dû fixer un point d'arrêt juste avant de vouloir débrancher le câble.
Si je recommençais, je mettrais un interrupteur (un bouton-poussoir momentané normalement fermé) dans un câble réseau.
Si la déconnexion physique provoque un comportement différent, vous pouvez connecter votre ordinateur à un concentrateur bon marché et placer le commutateur que j'ai mentionné ci-dessus entre votre concentrateur et le réseau principal.
- MODIFIER - Dans de nombreux cas, vous aurez besoin que la connexion réseau fonctionne jusqu'à ce que vous arriviez à un certain point de votre programme, PUIS vous voudrez vous déconnecter en utilisant l'une des nombreuses suggestions proposées.
la source
Pour moi, le moyen le plus simple était d'ajouter un itinéraire statique sur le routeur de bureau en fonction du réseau de destination. Acheminez simplement le trafic vers un hôte qui ne répond pas (par exemple, votre ordinateur) et vous obtiendrez le délai d'expiration de la demande.
La meilleure chose pour moi était que la route statique peut être gérée via l'interface Web et activée / désactivée facilement.
la source
Vous pouvez essayer de vous connecter à l'un des sites Web bien connus sur un port qui peut ne pas être disponible de l'extérieur - 200 par exemple. La plupart des pare-feu fonctionnent en mode DROP et ils simuleront un timeout pour vous.
la source