Créer artificiellement une erreur de temporisation de connexion
j'ai eu un bug 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 abandonnée par notre réseau interne). Comment puis-je générer ce genre d'effet artificiellement pour tester notre logiciel?
si c'est important, l'application est écrite en C++/MFC en utilisant les classes CAsyncSocket.
Edit:
j'ai essayé d'utiliser un hôte inexistant, et je obtenez l'erreur de socket:
wsaeinval (10022) argument invalide
ma prochaine tentative était d'utiliser Alexander suggestion de se connecter à un port différent, par exemple 81 (sur mon propre serveur cependant). Qui a très bien fonctionné. Exactement la même chose qu'une connexion abandonnée (60 secondes d'attente, puis erreur). Je vous remercie!
19 réponses
se connecte à un hôte existant mais à un port qui est bloqué par le pare-feu qui laisse tout simplement tomber les paquets TCP SYN. Par exemple, www.google.com:81.
Se connecter à une adresse IP non routable, telle que 10.255.255.1.
si vous êtes sur une machine unix, vous pouvez démarrer une écoute port en utilisant netcat:
nc -l 8099
puis, modifier votre service pour appeler ce qu'il fait habituellement à ce port par exemple http://localhost:8099/some/sort/of/endpoint
alors, votre service ouvrira la connexion et écrira des données, mais n'obtiendra jamais de réponse, et vous donnera donc un temps de lecture (plutôt que la connexion refusée)
vous pouvez utiliser la 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). Rien d'autre qu'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 tout ce que vous voulez tester à localhost:9000
. Quand vous le ferez, Python acceptera la connexion et accept()
la renverra. Sauf si vous envoyez des données par le clientsocket
, la socket de l'appelant devrait pause pendant le prochain recv()
.
L'URL suivante donne toujours un temps mort, et combine le meilleur des réponses de @Alexander et @Emu ci-dessus:
L'utilisation de example.com:81
est une amélioration par rapport à la réponse d'Alexander parce que example.com est réservé par la norme DNS, il sera donc toujours inaccessible, contrairement à google.com:81
, qui peut changer si Google le souhaite. En outre, parce que example.com
est défini pour être inaccessible, vous ne inonder les serveurs de Google.
je dirais que c'est une amélioration par rapport à la réponse de @emu parce que c'est beaucoup plus facile à se rappeler.
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 ceux-ci ne sont pas routables.
que dire d'une solution logicielle:
installez SSH server sur le serveur d'application. Ensuite, utilisez le tunnel socket pour créer un lien entre votre port local et le port distant sur le serveur d'application. Vous pouvez utiliser les outils client ssh pour le faire. Demandez à votre application client de se connecter à votre port local mappé à la place. Ensuite, vous pouvez casser le tunnel de socket à volonté pour simuler le délai de connexion.
si vous voulez utiliser une connexion active, vous pouvez aussi utiliser http://httpbin.org/delay / # , où # est le temps que vous voulez que leur serveur attende avant d'envoyer une réponse. Tant que votre délai est plus court que le délai ... doit simuler l'effet. Je l'ai utilisé avec succès avec le paquet python requests.
vous pouvez 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.
il y a quelques tactiques que j'ai utilisées dans le passé pour simuler des problèmes de réseautage;
- retirez le câble réseau
- éteignez le commutateur (idéalement avec le commutateur dans lequel l'ordinateur est branché encore être alimenté de sorte que la machine maintient sa "connexion réseau") entre votre machine et la" cible "machine
- lancer un logiciel pare-feu sur la machine cible qui dépose silencieusement les données reçues
une de ces idées pourrait vous donner quelques moyens de générer artificiellement le scénario dont vous avez besoin
vous pouvez installer le pilote Loopback de Microsoft qui créera une interface séparée pour vous. Ensuite, vous pouvez vous connecter à un de vos services (votre propre hôte). Ensuite, dans les connexions réseau, vous pouvez désactiver / activer une telle interface...
malgré 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 jusqu'à ce que la connexion fonctionne et ensuite je tirerais le câble. Ou - pour des raisons de commodité-avoir une machine virtuelle qui fonctionne comme le serveur d'essai (avec le réseau ponté) et juste désactiver l'interface de réseau virtuelle une fois que la connexion est établie.
il y a des services disponibles qui vous permettent de créer artificiellement des timeouts d'origine en appelant une API où vous spécifiez combien de temps le serveur prendra pour répondre. Le serveur Timeout sur macgyver est un exemple d'un tel service.
par exemple, si vous souhaitez tester une requête qui prend 15 secondes pour répondre, vous n'avez qu'à faire une requête post à l'API macgyver.
JSON Payload:
{
"timeout_length": 15000
}
réponse API (Après 15 secondes):
{
"response": "ok"
}
Délai d'expiration du Serveur programme sur macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
branchez votre câble réseau dans un commutateur qui n'a pas d'autre connexion/Câbles. Qui devrait à mon humble avis.
selon le logiciel de pare-feu que vous avez installé/disponible, vous devriez être en mesure de bloquer le port sortant et selon la façon dont votre pare-feu est configuré, il devrait tout simplement laisser tomber le paquet de demande de connexion. Pas de demande de connexion, pas de connexion, délai d'attente s'ensuit. Cela fonctionnerait probablement mieux si cela é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 paquet logiciel que ferait l'affaire.
la chose la plus facile serait de laisser tomber votre connexion en utilisant CurrPorts .
cependant, afin de tester votre code de gestion d'exception, peut-être devriez-vous envisager l'abstraction de votre code de connexion réseau, et écrire un talon, mock ou decorator qui lance des exceptions sur demande. Vous pourrez ensuite tester la logique de gestion des erreurs de l'application sans devoir utiliser le réseau.
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 d'arrêt juste avant de débrancher le câble.
si je le refais, je mets 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 hub bon marché et mettez le commutateur mentionné ci-dessus entre votre hub et le réseau principal.
-- EDIT -- Dans de nombreux cas, vous aurez besoin que la connexion réseau fonctionne jusqu'à ce que vous arriviez à un certain point dans votre programme, puis vous voudrez déconnecter en utilisant l'une des nombreuses suggestions offertes.
pour moi la façon la plus facile était d'ajouter la route statique sur le routeur de bureau basé sur le réseau de destination. Il suffit d'acheminer le trafic vers un hôte qui ne répond pas (par exemple votre ordinateur) et vous obtiendrez le délai de requête.
la meilleure chose pour moi était que la route statique peut être gérée sur l'interface web et activée/désactivée facilement.
vous pouvez essayer de vous connecter à l'un des sites Web bien connus sur un port qui peut ne pas être disponible à partir de l'extérieur-200 par exemple. La plupart des pare-feu fonctionnent en mode "DROP" et simulent un temps mort pour vous.