Question

Nous avons 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 puis-je générer artificiellement ce type d'effet afin de tester notre logiciel?

Si c'est important, l'application est écrite en C ++ / MFC à l'aide des classes CAsyncSocket.

Modifier:

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 de 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 (attente de 60 secondes, puis erreur). Merci!

Était-ce utile?

La solution

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.

Autres conseils

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

Si vous utilisez un ordinateur Unix, vous pouvez lancer l'écoute du port à l'aide de netcat:

nc -l 8099

Ensuite, modifiez votre service pour appeler 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, ce qui vous donnera un temps mort pour la lecture (plutôt que la connexion refusée)

L'URL suivante donne toujours un délai d'attente et combine le meilleur des réponses de @Alexander et @ Emu ci-dessus:

http://example.com:81

L'utilisation de exemple.com:81 constitue une amélioration par rapport à la réponse d'Alexander, car exemple.com est réservé par la norme DNS. Il sera donc toujours inaccessible, contrairement à google.com:81 <. / code>, qui peut changer si Google en a envie. De plus, comme example.com est défini comme inaccessible, vous ne submergerez pas les serveurs de Google.

Je dirais que c'est une amélioration par rapport à la réponse de @ emu car il est beaucoup plus facile de s'en souvenir.

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 l’établissement d’une connexion). 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 . Lorsque vous le ferez, Python acceptera la connexion et accept () le renverra. Sauf si vous envoyez des données via le clientsocket , le socket de l'appelant doit expirer lors du prochain recv () .

  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

Tous ces éléments ne sont pas routables.

Je voudrais attirer l'attention de chacun sur pathod

.

Avec une configuration (tirée de leurs exemples) de 200: b @ 100: dr , vous obtiendrez une connexion qui sera interrompue de manière aléatoire.

Qu'en est-il 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. Vous pouvez utiliser les outils client ssh pour le faire. Demandez à votre application cliente de se connecter à votre port local mappé. Ensuite, vous pouvez casser le tunnel de socket à volonté pour simuler le délai de connexion.

Si vous souhaitez utiliser une connexion active, vous pouvez également utiliser http://httpbin.org/delay/# , où # est le délai d'attente du serveur avant l'envoi d'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 pouvez modifier votre demande si vous envoyez quelque chose de sensible - aucune idée de ce qu'il advient des données qui leur sont envoyées.

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 temps de réponse du serveur. Server Timeout sur macgyver est un exemple d'un tel service.

Par exemple, si vous souhaitez tester une demande dont le délai de réponse est de 15 secondes, il vous suffit d'envoyer une demande de publication à l'API macgyver.

Charge utile JSON:

{
    "timeout_length": 15000
}

Réponse de l'API (après 15 secondes):

{
    "response": "ok"
}

Programme Server Timeout sur macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

Vous pouvez installer le pilote Microsoft Loopback qui créera une interface distincte pour vous. Ensuite, vous pouvez vous connecter à un service de votre choix (votre propre hôte). Ensuite, dans les connexions réseau, vous pouvez désactiver / activer une telle interface ...

Bien que le choix de l’opérateur à tester ne soit pas clairement défini: il existe une différence entre tenter une connexion à un hôte / port inexistant et un délai d’expiration d’une connexion déjà établie. Je voudrais aller avec Rob et attendre que la connexion fonctionne, puis tirez le câble. Ou, pour plus de commodité, demandez à une machine virtuelle de fonctionner comme serveur de test (avec un réseau ponté) et de simplement désactiver l'interface de réseau virtuel une fois la connexion établie.

La technique que j'utilise fréquemment pour simuler un délai d'attente de connexion aléatoire consiste à utiliser le transfert de port local ssh.

ssh -L 12345:realserver.com:80 localhost

Ceci transférera le trafic sur l'hôte local: 12345 vers realserver.com:80. Vous pouvez également faire une boucle dans votre ordinateur local si vous le souhaitez:

ssh -L 12345:localhost:8080 localhost

Ainsi, vous pouvez pointer votre application sur votre port localhost 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 aussi ctrl + c le shell après l'avoir quitté), ce qui supprimera la transmission, ce qui entraînera une perte de connexion pour votre application.

Branchez votre câble réseau sur un commutateur sans autre connexion / câble. Cela devrait fonctionner à mon humble avis.

Il y a quelques tactiques que j'ai utilisées par le passé pour simuler des problèmes de réseau;

  1. débranchez le câble réseau
  2. Eteignez l'interrupteur (idéalement, l'interrupteur auquel l'ordinateur est connecté est toujours alimenté de manière à ce que la machine conserve sa "connexion réseau") entre votre machine et la "cible". machine
  3. Exécuter un logiciel de pare-feu sur la machine cible qui supprime en silence les données reçues

L'une de ces idées peut vous donner des moyens de générer de manière artificielle le scénario dont vous avez besoin

En fonction du logiciel de pare-feu que vous avez installé / disponible, vous devriez pouvoir bloquer le port sortant et, en fonction de la configuration de votre pare-feu, vous devez 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 à abandonner les paquets au lieu d'envoyer des réinitialisations ou l'équivalent), mais il y a forcément un logiciel qui ferait l'affaire aussi.

Le plus simple serait de supprimer votre connexion à l'aide de CurrPorts .

Cependant, afin de tester votre code de gestion des exceptions, vous devriez peut-être envisager de résumer votre code de connexion réseau et d'écrire un stub, une maquette ou un décorateur qui lève des exceptions à la demande. Vous pourrez alors tester la logique de traitement des erreurs de l’application sans avoir à utiliser le réseau.

J'ai eu des problèmes dans le même sens que vous. Afin de tester le comportement du logiciel, je viens de débrancher le câble réseau au moment opportun. Je devais définir un point d'arrêt juste avant de vouloir débrancher le câble.

Si je le faisais à nouveau, je mettrais un interrupteur (un bouton-poussoir momentané normalement fermé) dans un câble réseau.

Si la déconnexion physique entraîne un comportement différent, vous pouvez connecter votre ordinateur à un concentrateur bon marché et placer le commutateur susmentionné entre votre concentrateur et le réseau principal.

- EDIT - Dans de nombreux cas, vous aurez besoin de la connexion réseau jusqu'à ce que vous atteigniez un certain point de votre programme. ALORS, vous voudrez vous déconnecter en utilisant l'une des nombreuses suggestions proposées.

Pour moi, le moyen le plus simple consistait à ajouter un itinéraire statique sur un routeur de bureau en fonction du réseau de destination. Il vous suffit de router le trafic vers un hôte qui ne répond pas (votre ordinateur, par exemple) et vous obtiendrez un délai de requête.

La meilleure chose à faire pour moi était que la route statique puisse être gérée via une interface Web et activée / désactivée 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 la durée du délai d'attente (jusqu'à 230 secondes) et le code de retour éventuel.

Vous pouvez essayer de vous connecter à l'un des sites Web 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 simulent un dépassement de délai.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top