He tenido un error en nuestro software que ocurre cuando recibo un tiempo de espera de conexión. Estos errores son muy raros (por lo general, 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 usando clases CAsyncSocket.
Editar:
Intenté usar un host inexistente y recibí 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 perdida (60 segundos de espera, luego error). ¡Gracias!
networking
network-programming
connection
tcp
Mark Ingram
fuente
fuente
Respuestas:
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, www.google.com:81.
fuente
Conéctese a una dirección IP no enrutable, como 10.255.255.1.
fuente
urllib
, esto devolverá una excepción 'Sin ruta al host'. FYISi está en una máquina Unix, puede comenzar a escuchar un puerto usando netcat:
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á datos, pero nunca recibirá una respuesta, por lo que le dará un Tiempo de espera de lectura (en lugar de Conexión rechazada)
fuente
ssh alanse@localhost -p 8099
, parece que lo hace.kill -STOP <pid>
(o simplemente CTRL-Z sin poner en segundo plano). El sistema actuará como si el servidor se estuviera ejecutando, pero espere a que el servidor acepte la conexión, lo que dará como resultado un tiempo de espera de conexión (error 110).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
El uso
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 logoogle.com:81
que puede cambiar si Google lo desea. Además, debido a queexample.com
se define como inalcanzable, no estará inundando los servidores de Google.Diría que es una mejora con respecto a la respuesta de @emu porque es mucho más fácil de recordar.
fuente
example.com
resolviendo 93.184.216.34, y en realidad sirve un breve HTML explicando que es un dominio de ejemplo ... el puerto 81 todavía no responde.httpstat.us
como @AndyTheEntity señaló en su respuesta.example.com
no es un dominio comercial, es uno de los pocos nombres de dominio que se especifica explícitamente como inutilizable. Nadie puede ser propietarioexample.com
y los enrutadores DNS saben que nunca se enruta a una dirección real. Así que no le cuesta a nadie el tiempo del servidor, no hay nada de malo en usarloexample.com
. Hay infraestructura detrás del dominio, por lo tanto, cada solicitud le está costando dinero a la IANA. El uso permitido se menciona en RFC 2606 y RFC 6761, no es libre de usar los dominios para el propósito que desee, comoflodding
ellos en lugar de otro servidor, como usted menciona. Su reclamo queexample.com is defined to be unreachable
es incorrecto, es accesible. El puerto 81 es inalcanzable ahora, pero ¿dónde se define eso para garantizarlo en el futuro?.test
dominio de nivel superior, en lugar deexample.com
, pero estos dominios se configuraron claramente para este propósito. Sí, puede costarle un poco de dinero a la IANA, pero este es un servicio que brindan. Nuestras tarifas de DNS lo están pagando.Muchas buenas respuestas, pero la solución más limpia parece ser este servicio
http://httpstat.us/504?sleep=60000
Puede configurar la duración del tiempo de espera (hasta 230 segundos) y el código de retorno eventual.
fuente
Puede usar Python REPL para simular un tiempo de espera mientras recibe datos (es decir, después de que una conexión se haya establecido con éxito). Solo se necesita una instalación estándar de Python.
Ahora espera una conexión entrante. Conecta lo que quieras probar
localhost:9000
. Cuando lo haga, Python aceptará la conexión y laaccept()
devolverá. A menos que envíe datos a través declientsocket
, el zócalo de la persona que llama debe expirar durante el siguienterecv()
.fuente
s.listen(5)
antess.accept()
?while True:
bucle, y eso parece ser un buen destino de tiempo de espera duradero para probar.Todos estos no son enrutables.
fuente
10.0.0.0
y10.255.255.255
dispararon un error EACCES en lugar de agotar el tiempo de espera.10.255.255.1
,172.16.0.0
,172.31.255.255
,192.168.0.0
, Y192.168.255.255
lo hizo de tiempo de espera, sin embargo.Me gustaría señalar la atención de todos al método
Con una configuración (tomada de sus ejemplos)
200:b@100:dr
obtendrás una conexión que cae aleatoriamente.fuente
¿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 usar 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 del zócalo a voluntad para simular el tiempo de espera de la conexión.
fuente
Si desea usar una conexión activa, también puede usar http://httpbin.org/delay/# , donde # es el tiempo que desea que su servidor espere antes de enviar una respuesta. Mientras su tiempo de espera sea más corto que el retraso ... debería 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 confidencial; no tengo idea de qué sucede con los datos que se les envían.
fuente
Hay servicios disponibles que le permiten crear artificialmente tiempos de espera de origen llamando a una API donde especifique cuánto tiempo tardará el servidor en responder. Server Timeout en macgyver es un ejemplo de dicho servicio.
Por ejemplo, si desea probar una solicitud que tarda 15 segundos en responder, simplemente haga una solicitud posterior a la API de macgyver.
Carga JSON:
Respuesta API (después de 15 segundos):
Programa de tiempo de espera del servidor en macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
fuente
Puede instalar el controlador Microsoft Loopback que creará una interfaz separada para usted. Luego puedes conectarte a algún servicio tuyo (tu propio host). Luego, en Conexiones de red, puede deshabilitar / habilitar dicha interfaz ...
fuente
A pesar de que no está completamente claro cuál es el OP que 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. Iría con Rob y esperaría hasta que la conexión funcionara y luego tiraría del cable. O, por conveniencia, tener una máquina virtual que funcione como servidor de prueba (con conexión en red en puente) y que simplemente desactive la interfaz de red virtual una vez que se establezca la conexión.
fuente
La técnica que uso con frecuencia para simular un tiempo de espera de conexión aleatorio es usar el reenvío de puerto local ssh.
Esto reenviará el tráfico en localhost: 12345 a realserver.com:80. También puede recorrer esto en su propia máquina local, si desea:
Para que pueda apuntar su aplicación a su puerto local y puerto personalizado, y el tráfico se enrutará al host de destino: puerto. Luego puede salir de este shell (es posible que también necesite presionar ctrl + c el shell después de salir) y eliminará el reenvío, lo que hace que su aplicación vea una pérdida de conexión.
fuente
Conecte su cable de red a un conmutador que no tenga otra conexión / cables. Eso debería funcionar en mi humilde opinión.
fuente
Hay un par de tácticas que he usado en el pasado para simular problemas de redes;
Una de estas ideas podría darle algunos medios para generar artísticamente el escenario que necesita
fuente
Dependiendo del software de firewall que haya instalado / disponible, debería poder bloquear el puerto de salida y dependiendo de cómo esté configurado su firewall, simplemente debería descartar 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 a nivel de enrutador (tienden a descartar paquetes en lugar de enviar restablecimientos, o lo que sea equivalente para la situación), pero seguramente habrá un paquete de software que también funcionaría.
fuente
Lo más fácil sería dejar su conexión usando CurrPorts .
Sin embargo, para probar su código de manejo de excepciones, quizás debería considerar abstraer su código de conexión de red y escribir un código auxiliar, simulador o 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.
fuente
recv()
falle inmediatamente), pero no pude encontrar una manera de simular un tiempo de espera (es decir, no se transfieren más datos, pero la conexión permanece abierta).Tuve problemas en la misma línea que tú. Para probar el comportamiento del software, simplemente desconecté el cable de red en el momento apropiado. Tuve que establecer un punto de interrupción justo antes de querer desconectar el cable.
Si lo volviera a hacer, pondría un interruptor (un botón momentáneamente normalmente cerrado) en un cable de red.
Si la desconexión física causa un comportamiento diferente, puede conectar su computadora a un concentrador barato y colocar el interruptor que mencioné anteriormente entre su concentrador y la red principal.
- EDITAR: en muchos casos, necesitará que la conexión de red funcione hasta que llegue a un cierto punto en su programa, ENTONCES querrá desconectarse utilizando una de las muchas sugerencias que se ofrecen.
fuente
Para mí, la forma más fácil fue 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 responda (por ejemplo, su computadora) y obtendrá el tiempo de espera de la 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.
fuente
Puede intentar conectarse a uno de los sitios web conocidos en un puerto que puede no estar disponible desde el exterior: 200 por ejemplo. La mayoría de los firewalls funcionan en modo DROP y simulará un tiempo de espera para usted.
fuente