2012-01-15 25 views
10

¿Cuál es la forma recomendada de cerrar "elegantemente" un socket TCP?Cerrar correctamente un socket TCP

He aprendido que cerrar() antes de leer() todos los datos restantes en mi búfer de host pueden causar problemas para el host remoto (podría perder todos los datos en su búfer de recepción que se ha anotado, pero aún no ha sido leído por su aplicación). ¿Es eso correcto?

¿Cuál sería un buen enfoque para evitar esa situación? ¿Hay alguna forma de decirle a la API que no me importa que se pierdan datos debido a que ignoro los datos almacenados en el búfer restantes y cierro el socket?

¿O tengo que considerar el problema en el nivel de protocolo de aplicación y usar algún tipo de señal de "fin de transmisión" implícita o explícita para que la otra parte sepa que es seguro cerrar un socket para leer?

+0

¿En qué idioma? – Kiril

+0

Enchufes de Berkeley; Estoy usando C, pero estoy interesado en el concepto general. – lxgr

Respuesta

15

1) Llame al shutdown para indicar que no va a escribir más datos en el zócalo.

2) Continúe a read desde el zócalo hasta que obtenga un error o la conexión se cierre.

3) Ahora close el zócalo.

Si no lo hace, puede terminar cerrando la conexión mientras todavía hay datos para leer. Esto dará lugar a un cierre desvergonzado.

+0

Ok, haré eso. Por curiosidad: ¿es realmente posible que los datos que he enviado al host remoto puedan perderse al ignorar los datos en mi buffer de recepción, y no solo los datos enviados por el host debido al cierre fallido? – lxgr

+1

Sí, los datos que envió * a * el host remoto se pueden perder porque el cierre fallido puede ocurrir antes de que el otro lado lea los datos. No desea llamar 'cerrar' hasta que esté seguro de que la conexión se ha cerrado. –

+3

1) apagado (calcetín, 1), 2) mientras (leer (calcetín, ...) = 0) 3) cerrar (calcetín) ¿Es ese el orden? – ernesto

Cuestiones relacionadas