2009-06-30 31 views
6

Estoy intentando anular una conexión de socket de modo que el cliente en el otro extremo obtenga un mensaje de error "WSAECONNABORTED (10053)". mensaje de error cuando sondea la conexión.Cómo cancelar un socket en C#

Cerrar() y Apagar() se desconectarán correctamente. No quiero una desconexión elegante. Quiero abortar para que el cliente sienta que algo salió mal.

Gracias,

EDIT: Estoy de codificación de un servidor y quiero abortar tomas de clientes que se conectan

+0

No estoy seguro de cómo hacer lo que su pedir, pero parece que el cliente tendría expectativas acerca de lo que obtendrá a través de la conexión de socket. Si el servidor pasa un valor que no tiene sentido para el cliente, entonces se cierra con gracia, ¿no tendría el mismo efecto que abortar el socket? Por ejemplo, el cliente espera un valor int, el servidor envía cadena y luego se cierra. Solo un pensamiento. – devuxer

+0

Estoy codificando un servidor y quiero que el servidor anule la conexión si el cliente envía datos que no cumplen con las especificaciones del protocolo. –

+0

posible duplicado de [Razones oficiales para "Cancelación de conexión causada por software: error de escritura de socket"] (http://stackoverflow.com/questions/2126607/ofunciones-oficiales-para-confianza-de-la-conexión-de-software-de-configuración-) error). Siendo así, no puede simularlo, ya que proviene de la pila TCP en condiciones de falla de red. – EJP

Respuesta

2

He conseguido simular esta situación:

para hacer un grácil desconexión normales:

haces:

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 

Sin embargo, para hacer un aborto, lo hace:

socket.Shutdown(SocketShutdown.Send); 
socket.Close(); 

Creo que la diferencia es que el cliente no recibirá ningún paquete de ACK y piensa que el reinicio de la computadora o algo así.

+0

TCP es un protocolo bidireccional, es decir, requiere el cierre de la conexión desde ambos lados. Por lo tanto, cuando llama a Shutdown con "SocketShutdown.Both", desactiva tanto el envío como la recepción en el socket. Sin embargo, cuando hace "SocketShutdown.Send", el Servidor cierra su lado de la conexión TCP. En este escenario, cuando el cliente intenta enviar mensajes al servidor recibirá ECONNABORTED. Eche un vistazo a http://www.chilkatsoft.com/p/p_299.asp para entenderlo mejor. –

+1

Esto no provoca un aborto de conexión de ningún tipo, y menos el de la pregunta del OP. Cerrar el envío simplemente envía el FIN prematuramente, pero de todos modos se habría enviado al cierre. Normalmente no hay necesidad de apagar inmediatamente antes de cerrar. Hay una manera de forzar un restablecimiento de conexión, pero no voy a documentarlo aquí ya que hay pocos usos correctos de él. – EJP

1

Lo que si matas el proceso, y/o reiniciar la máquina, y/o desenchufar el cable ethernet, sin llamar a Close() y/o Shutdown()?

+0

¿Estás bromeando? claramente él quiere que el * programa * envíe ECONNABORTED cuando ocurre un error.exigirle que bloquee físicamente el enlace/proceso de la red derrota por completo el propósito. – muusbolla

+0

Quiero decir, elimine el * otro * proceso en el * otro * final de la conexión. Quiere que * este * programa * reciba * ECONNABORTED de su pila TCP local, lo que (creo) ocurre si la conexión se abende (por ejemplo, si el par remoto desaparece). – ChrisW

+1

Estoy de acuerdo con Chris. No puede hacer que el servidor envíe ECONNABORTED. Solo cuando el cliente vea Acks perdidos por los datos que envía recibirá ECONNABORTED en la próxima llamada de Enviar. –

-1

intentar llamar a endSend() o EndReceive() dependiendo de la situación inmediatamente seguido por un Dispose()

0

No creo que sea posible para obtener el comportamiento que desee con la aplicación .Net Socket otra que hacer que el cliente envíe keep-alives intermitentes. Intenté todo tipo de cosas para obtener el comportamiento que describiste y terminé implementando mensajes para mantener vivo. Si el servidor llama a Close(), el socket del cliente recibirá un error de conexión abortada la próxima vez que intente enviar datos.

-1

puede intentar codificar todas las tomas secundarias en otra secuencia y matarla cuando desee bloquear las conexiones.

+2

Sin embargo, no tendrá el efecto deseado. Por favor, no publique simples conjeturas aquí. – EJP

2

Los detalles subyacentes, incluso cuando es realmente apropiado abortar a la fuerza una conexión, se describen en gran detalle aquí (https://stackoverflow.com/a/13088864/1280848).

El C# forma de hacer esto es:

socket.LingerState = new LingerOption(true, 0); 
socket.Close(); 

Es decir, utilizar SO_LINGER con TIME_WAIT = 0

Cuestiones relacionadas