.net - visual - ¿Cómo emular una conexión TCP a la fuerza cerrada?
tipos de protección para los protocolos tcp/ip (4)
¿Cómo puede mi programa de prueba causar un error de "conexión forzosamente cerrada" en el oyente TCP al que está conectado?
Según entiendo, tendría que cerrar la conexión sin seguir el protocolo TCP, es decir, sin enviar un paquete "FIN". ¿Se puede hacer esto con un Socket
.NET estándar en modo TCP?
Parece que puedo hacer esto abriendo varias conexiones y luego terminando el programa de prueba, pero no de ninguna otra manera que haya intentado.
Dependiendo de su entorno de código veo varias posibilidades.
Una forma sería implementar un patrón de Adaptador como se describe en esta pregunta SO: TDD y Mocking out TcpClient . (Ver allí para ejemplos de código.)
Podría implementar una clase contenedora que use el TcpClient y la interfaz simulada de esa clase contenedora. Si lo hace de esta manera, lo desacoplará del TcpClient y hará que cambie a otras implementaciones o bloques, si es necesario.
La segunda idea sería utilizar un marco de burla como Moq , RhinoMock (ambos de código abierto) o uno comercial como JustMock de Telerik (mi preferencia personal). JustMock también ofrece una edición gratuita que se adapta bien a esta tarea y también se puede utilizar en proyectos comerciales. El uso de dicho marco le permite simular fácilmente la interfaz pública de sus clases de red.
Por supuesto, también tendría sentido usar un marco de burla para la primera opción.
De cualquier manera, los simulacros se pueden organizar para arrojar las excepciones deseadas y probar cómo se adapta el código.
No debería poder lograrlo abriendo varias conexiones y luego terminando el programa de prueba. El kernel debe encargarse de cerrar todas las conexiones TCP (limpiamente, al menos en la capa de TCP y abajo) cuando el programa sale.
De hecho, si hay algo que puedas hacer desde un espacio de usuario sin privilegios para causar una conexión TCP suspendida / interrumpida, se trata de un error en tu kernel y debería corregirse :-)
Su mejor opción es probablemente usar sockets sin procesar para inyectar los paquetes que desee. Deberá construir sus propios encabezados de TCP e IP en estos paquetes, pero para propósitos de pruebas unitarias puede construir encabezados a partir de valores mayormente fijos con algunos valores de variante introducidos. Sugiera comenzar con una captura de paquetes de un funcionamiento normal, funcionando sesión, agregue un paquete RST en el lugar correcto y más o menos reproduzca esa secuencia en su programa de prueba.
Creo que hacer esto para probar tu aplicación es excesivo. Estás probando principalmente la pila TCP de los hosts con este enfoque. Para probar su aplicación, burlarse del socket para que devuelva un error en el momento correcto es probablemente lo suficientemente bueno.
Pude lograr esto usando la utilidad CurrPorts .
Para mis propósitos, estaba intentando probar un bloqueo dentro de un SDK de terceros que fue causado por este error.
- Ejecute CurrPorts en modo Administrador
- Hit Refresh cuando vea la conexión.
- Haga clic con el botón derecho y "Cerrar conexiones TCP seleccionadas" (o use ctl-T)
Puede descargar una utilidad de monitoreo tcp del sitio de Microsoft. El nombre de la empresa es TcpView y le permite controlar y cerrar sus conexiones tcp para simular esta condición.
TcpView:
https://technet.microsoft.com/en-us/sysinternals/tcpview.aspx