2009-02-24 6 views
5

Reconozco que este tipo de pregunta tiene una larga historia, pero la forma en que estoy usando esto debe ser la correcta '.net' y, sin embargo, no parece funcionar.C# /. Net Socket.Shutdown

Tengo un daemon de servidor IP sincrónico trivial que hace un simple aceptar Socket, hacer algunas cosas, socket.send, socket.shutdown, socket.close. Mi cliente es otra aplicación trivial de C# que hace URLDownloadToFile.

Lo que sucede es que parte del tiempo URLDownloadToFilefails falla con (0x800C0008) .. piensa que su recurso de descarga falló.

Mi servidor secuencia de extremo lateral es:

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

Si cambio que esto

socket.Disconnect(); 
socket.Close(); 

(i abrir lo anterior con sockopt Linger cierto tiempo de espera de 5 segundos)

esto funciona estupendo.

Me falta algo en el método de apagado ... parece que la MS "magic bullet" quiere que uses para hacer una salida que finalmente enviará los datos de envío restantes.

Demasiado, (y esto no puede ser correcto) parece como el cierre ... mata cualquier proceso asíncrono que pueda estar en progreso desde el apagado().

¿Alguna idea?

Respuesta

3

Basado en Socket.Disconnect

Si necesita llamar Desconectar sin primero apagado de llamada, puede establecer la opción DontLinger zócalo false y especificar un intervalo de tiempo de espera distinto de cero para asegurar que los datos en cola para la transmisión saliente es enviado. Desconecte los bloques hasta que se envíen los datos o hasta que expire el tiempo de espera especificado. Si establece DontLinger en falso y especifica un intervalo de tiempo de espera cero , Cerrar libera la conexión y automáticamente descarta datos salientes en cola.

Sugiere la parada es en el mejor de innecesaria ...

+0

del todo innecesaria antes de llamar Desconectar. El texto citado dice que debe cambiar la configuración antes de llamar a Desconectar. Si no, descartará los datos. – usr

+0

¿No es eso lo que mi respuesta indica? Si cambia la configuración (que el OP indica que sí) no necesita el apagado si está contento con el comportamiento de tiempo de espera ... – ShuggyCoUk

2

Para reutilizar el uso del zócalo:

socket.Shutdown(SocketShutdown.Both); 
socket.Disconnect(true); 

Para el uso de cierre de fuerza:

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 
No
+3

reutilizar el socket no funciona. Intenta conectarte de nuevo, arrojará una InvalidOperationException. –