Crear artificialmente un error de tiempo de espera de conexión

He tenido un error en nuestro software que ocurre cuando recibo un tiempo de espera de conexión. Estos errores son muy raros (generalmente cuando mi conexión se cae por nuestra red interna). ¿Cómo puedo generar este tipo de efecto artificialmente para poder probar nuestro software?

Si es importante, la aplicación está escrita en C ++ / MFC utilizando las clases CAsyncSocket.

Editar:

Intenté usar un host inexistente y obtuve el error de socket:

WSAEINVAL (10022) Argumento inválido

Mi siguiente bash fue utilizar la sugerencia de Alexander de conectarse a un puerto diferente, por ejemplo, 81 (en mi propio servidor). Eso funcionó muy bien. Exactamente lo mismo que una conexión perdida (60 segundos de espera, luego error). ¡Gracias!

Conéctese a un host existente, pero a un puerto que está bloqueado por el firewall que simplemente descarta los paquetes TCP SYN. Por ejemplo, http://www.google.com:81.

Conéctese a una dirección IP no enrutable, como 10.255.255.1.

Si está en una máquina Unix, puede iniciar una escucha de puerto usando netcat:

 nc -l 8099 

A continuación, modifique su servicio para llamar a lo que normalmente hace a ese puerto, por ejemplo, http: // localhost: 8099 / some / sort / of / endpoint

Luego, su servicio abrirá la conexión y escribirá datos, pero nunca obtendrá una respuesta, por lo que le dará un tiempo de espera de lectura (en lugar de conexión rechazada).

Puede utilizar Python REPL para simular un tiempo de espera mientras recibe datos (es decir, después de que la conexión se haya establecido correctamente). No se necesita nada más que una instalación estándar de Python.

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

Ahora espera una conexión entrante. Conecte lo que quiera probar con localhost:9000 . Cuando lo haga, Python aceptará la conexión y accept() devolverá. A menos que envíe datos a través del clientsocket , el zócalo de la persona que llama debe agotar el tiempo de espera durante la próxima recv() .

La siguiente URL siempre da un tiempo de espera y combina lo mejor de las respuestas de @Alexander y @ Emu anteriores:

http://example.com:81

Usar example.com:81 es una mejora en la respuesta de Alexander porque example.com está reservado por el estándar DNS, por lo que siempre será inalcanzable, a diferencia de google.com:81 , que puede cambiar si Google así lo desea. Además, como example.com se define como inalcanzable, no inundarás los servidores de Google.

Diría que es una mejora sobre la respuesta de @emu porque es mucho más fácil de recordar.

10.0.0.0, 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0, 192.168.255.255

todos estos no son enrutables

Me gustaría llamar la atención de todos sobre pathod

Con una configuración (tomada de sus ejemplos) de 200:b@100:dr obtendrá una conexión que cae aleatoriamente.

¿Qué tal una solución de software?

Instale el servidor SSH en el servidor de aplicaciones. Luego, use socket tunnel para crear un enlace entre su puerto local y el puerto remoto en el servidor de aplicaciones. Puede usar las herramientas del cliente ssh para hacerlo. Haga que su aplicación cliente se conecte a su puerto local asignado. Luego, puede romper el túnel de socket a voluntad para simular el tiempo de espera de la conexión.

Si desea utilizar una conexión activa también puede usar http://httpbin.org/delay/# , donde # es la hora que desea que su servidor espere antes de enviar una respuesta. Siempre que su tiempo de espera sea más corto que el retraso … debería simular el efecto. Lo utilicé con éxito con el paquete python requests.

Es posible que desee modificar su solicitud si está enviando algo confidencial, sin tener en cuenta lo que sucede con los datos que se le envían.

Hay un par de tácticas que he usado en el pasado para simular problemas de red;

  1. Extraiga el cable de red
  2. Apague el interruptor (idealmente con el interruptor que la computadora está enchufada y que todavía está en funcionamiento para que la máquina mantenga su “conexión de red”) entre su máquina y la máquina “objective”.
  3. Ejecute el software de firewall en la máquina de destino que silenciosamente deja caer los datos recibidos

Una de estas ideas podría darle algunos medios para generar artificialmente el escenario que necesita

Puede instalar el controlador Microsoft Loopback que creará una interfaz separada para usted. Luego puede conectarse a algún servicio suyo (su propio host). Luego, en Conexiones de red, puede deshabilitar / habilitar dicha interfaz …

A pesar de que no está completamente claro cuál OP quiere probar: hay una diferencia entre intentar una conexión a un host / puerto inexistente y un tiempo de espera de una conexión ya establecida. Me gustaría ir con Rob y esperar hasta que la conexión esté funcionando y luego tirar del cable. O, para mayor comodidad, tener una máquina virtual que funcione como el servidor de prueba (con conexión en puente de red) y simplemente desactivar la interfaz de red virtual una vez que se establezca la conexión.

Hay servicios disponibles que le permiten crear artificialmente tiempos de espera de origen llamando a una API donde se especifica cuánto tardará el servidor en responder. Server Timeout en macgyver es un ejemplo de dicho servicio.

Por ejemplo, si desea probar una solicitud que demora 15 segundos en responder, simplemente debe realizar una solicitud posterior a la API macgyver.

Carga útil JSON:

 { "timeout_length": 15000 } 

Respuesta API (después de 15 segundos):

 { "response": "ok" } 

Progtwig de tiempo de espera del servidor en macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

Conecte su cable de red a un interruptor que no tenga otra conexión / cable. Eso debería funcionar en mi humilde opinión.

Dependiendo del software de firewall que haya instalado / disponible, debería poder bloquear el puerto de salida y, dependiendo de cómo esté configurado el firewall, debería simplemente eliminar el paquete de solicitud de conexión. Sin solicitud de conexión, sin conexión, se produce el tiempo de espera. Esto probablemente funcionaría mejor si se implementara en un nivel de enrutador (tienden a soltar paquetes en lugar de enviar reinicios, o lo que sea el equivalente para la situación), pero es seguro que habrá un paquete de software que también lo haga.

Lo más fácil sería abandonar su conexión utilizando CurrPorts .

Sin embargo, para probar su código de manejo de excepciones, quizás deba considerar abstraer su código de conexión de red, y escribir un stub, simulacro o decorador que arroje excepciones bajo demanda. Luego podrá probar la lógica de manejo de errores de la aplicación sin tener que usar la red.

Tuve problemas en la misma línea que tú. Para probar el comportamiento del software, simplemente desenchufé el cable de red en el momento apropiado. Tuve que establecer un punto de ruptura justo antes de querer desconectar el cable.

Si lo estuviera haciendo de nuevo, pondría un interruptor (un botón momentáneo normalmente cerrado, uno) en un cable de red.

Si la desconexión física causa un comportamiento diferente, puede conectar su computadora a un centro económico y poner el interruptor que mencioné anteriormente entre su hub y la red principal.

– EDITAR – En muchos casos necesitará que la conexión de red funcione hasta que llegue a cierto punto en su progtwig, ENTONCES querrá desconectarse utilizando una de las muchas sugerencias que se ofrecen.

Para mí, la forma más fácil fue agregar una ruta estática en el enrutador de la oficina en función de la red de destino. Simplemente enrute el tráfico a un host que no responde (por ejemplo, su computadora) y obtendrá el tiempo de espera de la solicitud.

Lo mejor para mí fue que la ruta estática puede administrarse a través de la interfaz web y habilitarse / deshabilitarse fácilmente.

Puede tratar de conectarse a uno de los sitios web conocidos en un puerto que puede no estar disponible desde el exterior, por ejemplo, 200. La mayoría de los firewalls funcionan en modo DROP y simularán un tiempo de espera para usted.