378 votes

Créer artificiellement une erreur de délai de connexion

J'ai eu un bug dans notre logiciel qui se produit lorsque je reçois un timeout de connexion. Ces erreurs sont très rares (généralement lorsque ma connexion est interrompue par notre réseau interne). Comment puis-je générer artificiellement ce type d'effet afin de pouvoir tester notre logiciel ?

Si cela a de l'importance, l'application est écrite en C++/MFC en utilisant les classes CAsyncSocket.

Editar:

J'ai essayé d'utiliser un hôte inexistant, et j'obtiens l'erreur de socket :

WSAEINVAL (10022) Argument non valide

Ma tentative suivante a consisté à utiliser Alexander La suggestion de l'auteur de se connecter à un port différent, par exemple 81 (sur mon propre serveur cependant). Cela a très bien fonctionné. C'est exactement la même chose qu'une connexion interrompue (60 secondes d'attente, puis erreur). Merci !

0 votes

Salut Mark, j'ai essayé la solution qui fonctionne pour vous mais ce que je reçois est #503 (Service indisponible.). Il ne devrait pas y en avoir, #504 (Gateway Timeout), #599 (erreur de délai de connexion au réseau), #598 (erreur de délai de lecture du réseau).

0 votes

Voulez-vous un délai de connexion ou un délai de lecture ?

530voto

emu Points 961

Connectez-vous à une adresse IP non routable, telle que 10.255.255.1.

13 votes

Idem, et je suppose que c'est une meilleure réponse puisque google.com:81 pourrait être joignable un jour.

169 votes

... et parce qu'envoyer des paquets aléatoires aux serveurs d'autres personnes à partir de vos tests unitaires est impoli.

15 votes

Cela ne fonctionnera pas toujours. Par exemple, avec la fonction urllib cela renverra une exception 'No route to host'. POUR VOTRE INFORMATION

381voto

Alexander Points 4298

Se connecter à un hôte existant mais sur un port bloqué par le pare-feu qui rejette simplement les paquets TCP SYN. Par exemple, www.google.com:81.

6 votes

Cette réponse est simple et fonctionne exactement comme la réponse de @emu ci-dessous. Je comprends que cette réponse n'avait pas l'intention de suggérer l'utilisation de google.com:81 mais le point ici est d'utiliser un port différent qui est bloqué. Vous pouvez donc toujours utiliser <votre propre IP>:<port bloqué>.

17 votes

A moins que ce ne soit votre propre serveur, il est impoli de frapper d'autres serveurs pour vos tests. Utilisez une solution civilisée comme celle mentionnée par emu ci-dessous, en utilisant une adresse IP non routable comme 10.255.255.1, ou configurez votre propre serveur virtuel à des fins de test.

2 votes

Je pense que Google a peut-être bloqué ce port. Quand je teste ça avec Chrome, j'ai juste "Server not available". Lorsque j'utilise l'astuce de @emu ci-dessous, la connexion se bloque comme prévu. Est-ce que quelque chose m'échappe ?

16voto

hheimbuerger Points 3156

Vous pouvez utiliser le REPL Python pour simuler un délai d'attente lors de la réception de données (c'est-à-dire après qu'une connexion ait été établie avec succès). Seule une installation standard de Python est nécessaire.

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

Maintenant, il attend une connexion entrante. Connectez ce que vous voulez tester à localhost:9000 . Si vous le faites, Python acceptera la connexion et accept() le renverra. À moins que vous n'envoyiez des données par l'intermédiaire du clientsocket la socket de l'appelant devrait être interrompue pendant le prochain appel de la fonction recv() .

0 votes

Ça ne marche pas pour moi ; il manque quelque chose. Peut-être s.listen(5) avant s.accept() ?

0 votes

@bmaupin Cela semble raisonnable, je suppose que j'ai juste oublié cela. Je l'ai modifié maintenant (mais avec une file d'attente de 0), merci !

2 votes

J'ai pu mettre les parties "écouter" et "accepter" dans un while True: et cela semble être une bonne destination durable de timeout à atteindre pour les tests.

10voto

amenthes Points 406

Je voudrais attirer l'attention de tout le monde sur mitmproxy .

Avec une configuration (tirée de leurs exemples) de 200:b@100:dr vous aurez une connexion qui s'interrompra de façon aléatoire.

2 votes

Pas la même chose qu'un délai d'attente

2 votes

Je voudrais souligner que l'édition par @zb226 n'est pas vraiment utile dans ce cas. s'il est vrai que pathod (ce que j'ai recommandé il y a sept ans) fait maintenant partie de mitmproxy, ce post n'a aucun sens dans sa forme actuelle. Je n'ai pas pu trouver de documentation sur la façon dont une chose similaire est réalisable avec mitmproxy, je laisse donc ce commentaire pour tous ceux qui se demandent comment c'est censé fonctionner.

0 votes

@amenthes well, at least it made you aware of that fact :)

8voto

stoneboy Points 51

Pourquoi pas une solution logicielle ?

Installer le serveur SSH sur le serveur d'application. Ensuite, utilisez le tunnel de socket pour créer un lien entre votre port local et le port distant sur le serveur d'application. Vous pouvez utiliser des outils client ssh pour ce faire. Demandez à votre application cliente de se connecter à votre port local mappé. Ensuite, vous pouvez rompre le tunnel de socket à volonté pour simuler le délai de connexion.

0 votes

Cela ne provoquera pas un dépassement du délai de connexion, mais une réinitialisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X