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!

235
demandé sur Kevin Burke 2008-09-19 13:57:47

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.

240
répondu Alexander 2008-09-19 10:02:57

Se connecter à une adresse IP non routable, telle que 10.255.255.1.

379
répondu emu 2009-05-24 20:42:43

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)

23
répondu Tom Chamberlain 2016-05-26 15:50:18

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

15
répondu Henrik Heimbuerger 2015-09-01 07:54:20

L'URL suivante donne toujours un temps mort, et combine le meilleur des réponses de @Alexander et @Emu ci-dessus:

http://example.com:81

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.

14
répondu speedplane 2016-11-07 06:45:10

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.

13
répondu rajesh_kw 2015-07-23 07:54:41

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 au hasard.

9
répondu amenthes 2014-02-20 10:45:35

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.

8
répondu stoneboy 2010-03-12 15:05:33

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.

3
répondu RoHS4U 2016-08-15 19:30:03

il y a quelques tactiques que j'ai utilisées dans le passé pour simuler des problèmes de réseautage;

  1. retirez le câble réseau
  2. é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
  3. 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

1
répondu Rob 2008-09-19 10:03:27

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...

1
répondu Marcin Gil 2008-09-19 10:10:40

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.

1
répondu 2008-09-19 13:20:35

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

1
répondu Timothy Moody 2016-09-11 23:22:14

branchez votre câble réseau dans un commutateur qui n'a pas d'autre connexion/Câbles. Qui devrait à mon humble avis.

0
répondu GHad 2008-09-19 10:00:33

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.

0
répondu Matthew Scharley 2008-09-19 10:03:38

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.

0
répondu Matt Howells 2008-09-19 10:10:20

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.

0
répondu Brad Bruce 2008-09-19 10:55:37

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.

0
répondu Ivan Marjanovic 2016-08-11 18:40:15

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.

-1
répondu Dmitry Khalatov 2008-09-19 10:09:57