networking - significa - Crea artificialmente un error de tiempo de espera de conexión
hosting server connect timeout (19)
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 importa, la aplicación está escrita en C ++ / MFC usando clases CAsyncSocket.
Editar:
He intentado usar un host inexistente y recibo el error de socket:
WSAEINVAL (10022) Argumento no válido
Mi siguiente intento fue utilizar la sugerencia de Alexander de conectarse a un puerto diferente, por ejemplo, 81 (aunque en mi propio servidor). Eso funcionó muy bien. Exactamente lo mismo que una conexión interrumpida (espera de 60 segundos, luego error). ¡Gracias!
¿Qué tal una solución de software?
Instale el servidor SSH en el servidor de aplicaciones. Luego, use el túnel de socket para crear un enlace entre su puerto local y el puerto remoto en el servidor de aplicaciones. Puede utilizar las herramientas de cliente ssh para hacerlo. Haga que su aplicación cliente se conecte a su puerto local asignado en su lugar. Luego, puede romper el túnel de socket a voluntad para simular el tiempo de espera de la conexión.
A pesar de que no está completamente claro cuál quiere probar el OP: hay una diferencia entre intentar una conexión a un host / puerto inexistente y un tiempo de espera de una conexión ya establecida. Iría con Rob y esperaría hasta que la conexión esté funcionando y luego tirar del cable. O, para mayor comodidad, tener una máquina virtual que funcione como servidor de prueba (con redes puenteadas) y simplemente desactive la interfaz de red virtual una vez que se establezca la conexión.
Conéctese a un host existente pero a un puerto bloqueado por el firewall que simplemente descarta los paquetes TCP SYN. Por ejemplo, www.google.com:81.
Conéctese a una dirección IP no enrutable, como 10.255.255.1.
Conecte su cable de red a un interruptor que no tenga otra conexión / cables. Eso debería funcionar bien.
Dependiendo del software de firewall que haya instalado / disponible, debería poder bloquear el puerto de salida y, dependiendo de la configuración de su firewall, solo debe dejar caer el paquete de solicitud de conexión. Sin solicitud de conexión, sin conexión, se produce un tiempo de espera. Probablemente, esto funcionaría mejor si se implementara a nivel de enrutador (tienden a eliminar paquetes en lugar de enviar restablecimientos, o lo que sea el equivalente para la situación) pero es probable que haya un paquete de software que también haga el truco.
Hay servicios disponibles que le permiten crear artificialmente tiempos de espera de origen al llamar a una API en la que especifica el tiempo que tardará el servidor en responder. El tiempo de espera del servidor en macgyver es un ejemplo de dicho servicio.
Por ejemplo, si desea probar una solicitud que demora 15 segundos en responder, simplemente realizará una solicitud posterior a la API de macgyver.
Carga JSON:
{
"timeout_length": 15000
}
Respuesta API (después de 15 segundos):
{
"response": "ok"
}
Server Timeout program on macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
Hay un par de tácticas que he usado en el pasado para simular problemas de redes;
- Saque el cable de red
- Apague el interruptor (idealmente con el interruptor en el que la computadora está enchufada aún con energía para que la máquina mantenga su "conexión de red") entre su máquina y la máquina "objetivo"
- Ejecute software de firewall en la máquina de destino que descarta silenciosamente los datos recibidos
Una de estas ideas podría darle algunos medios para generar artificialmente el escenario que necesita.
La siguiente URL siempre da un tiempo de espera y combina lo mejor de las respuestas de @Alexander y @ Emu anteriores:
El uso de 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 lo desea. Además, debido a que example.com
se define como inalcanzable, no inundará los servidores de Google.
Yo diría que es una mejora sobre la respuesta de @ emu porque es mucho más fácil de recordar.
Lo más fácil sería abandonar su conexión usando CurrPorts .
Sin embargo, para probar de forma unitaria su código de manejo de excepciones, tal vez debería considerar abstraer el código de conexión de su red y escribir un código auxiliar, un simulacro o un decorador que arroje excepciones a pedido. Entonces podrá probar la lógica de manejo de errores de la aplicación sin tener que usar la red.
Me gustaría señalar la atención de todos a pathod.
Con una configuración (tomada de sus ejemplos) de 200:b@100:dr
obtendrás una conexión que cae al azar.
Para mí, la forma más sencilla era agregar una ruta estática en el enrutador de la oficina según la red de destino. Simplemente enrute el tráfico a algún host que no responde (por ejemplo, su computadora) y obtendrá un tiempo de espera de solicitud.
Lo mejor para mí fue que la ruta estática se puede administrar a través de la interfaz web y habilitar / deshabilitar fácilmente.
Puede instalar el controlador Microsoft Loopback que creará una interfaz independiente para usted. Luego puedes conectarte a algún servicio tuyo (tu propio host). Luego, en Conexiones de red, puede deshabilitar / habilitar dicha interfaz ...
Puede intentar conectarse a uno de los sitios web conocidos en un puerto que puede no estar disponible desde afuera, por ejemplo, 200. La mayoría de los firewalls funcionan en modo DROP y simulará un tiempo de espera para usted.
Puede usar el REPL de Python para simular un tiempo de espera mientras se reciben datos (es decir, después de que la conexión se haya establecido correctamente). Sólo se necesita 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 a localhost:9000
. Cuando lo haga, Python aceptará la conexión y accept()
lo devolverá. A menos que envíe cualquier dato a través de la clientsocket
del clientsocket
, el socket de la persona que llama debe clientsocket
durante la próxima recv()
.
Si desea usar una conexión activa, también puede usar http://httpbin.org/delay/# , donde # es el tiempo que desea que espere su servidor antes de enviar una respuesta. Siempre que su tiempo de espera sea más corto que el retraso ... debe simular el efecto. Lo he usado con éxito con el paquete de solicitudes de python.
Es posible que desee modificar su solicitud si está enviando algo sensible, sin tener idea de lo que sucede con los datos que se les envían.
Si está en una máquina Unix, puede iniciar una escucha de puerto utilizando netcat:
nc -l 8099
Luego, 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á los datos, pero nunca obtendrá una respuesta, por lo que le dará un Tiempo de espera de lectura (en lugar de Conexión rechazada)
Tuve problemas en la misma línea que tú. Para probar el comportamiento del software, simplemente desenchufé el cable de red en el momento adecuado. Tuve que establecer un punto de interrupción justo antes de que quisiera desconectar el cable.
Si lo estuviera haciendo de nuevo, pondría un interruptor (un botón pulsador momentáneo normalmente cerrado) en un cable de red.
Si la desconexión física causa un comportamiento diferente, puede conectar su computadora a un hub barato y colocar 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 de su programa, LUEGO, querrá desconectarse utilizando una de las muchas sugerencias que se ofrecen.
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.