traduccion tipos socket electrico celular sockets tcp

sockets - tipos - cerrar() socket directamente después de send(): inseguro?



tcp socket c++ (1)

He estado leyendo la última página SO_LINGER mucho. Te recomiendo que lo leas también. Discute casos extremos de grandes transferencias de datos con respecto a los sockets TCP.

No soy el experto en SO_LINGER, pero en mi código de servidor (todavía en desarrollo activo) hago lo siguiente:

  1. Después de que el último byte se envía a través de send (), llamo "shutdown (calcetín, SHUT_WR)" para activar un FIN que se enviará.

  2. Luego, espere a que una llamada recv () posterior en ese socket devuelva 0 (o recv devuelve -1 y errno es cualquier otra cosa que EAGAIN / EWOULDBLOCK).

  3. Luego, el servidor cierra () en el socket.

La suposición es que el cliente cerrará su socket primero después de haber recibido todos los bytes de la respuesta.

Pero tengo un timeout forzado entre el envío final () y cuando recv () indica EOF. Si el cliente nunca cierra su extremo de la conexión, el servidor abandonará la espera y cerrará la conexión de todos modos. Estoy en 45-90 segundos para este tiempo de espera.

Todos mis conectores son no bloqueantes y uso poll / epoll para recibir notificaciones de eventos de conexión como una pista para ver si es el momento de intentar llamar de nuevo a recv () o send ().

¿Es sabio / seguro close() un socket directamente después del último send() ?

Sé que se supone que TCP intentará entregar todos los datos restantes en el búfer de envío incluso después de cerrar el socket, pero ¿realmente puedo contar con eso?

Me estoy asegurando de que no haya datos restantes en mi buffer de recepción para que no se envíe ningún RST después de mi cierre.

En mi caso, el cierre es realmente la última declaración de código antes de llamar a exit() .

¿Seguirá realmente la pila TCP intentando y transmitiendo los datos incluso después de que el proceso de envío haya finalizado? ¿Es eso tan confiable como esperar un tiempo de espera arbitrario antes de llamar a close() configurando SO_LINGER?

Es decir, ¿se aplican los mismos tiempos de espera TCP, o son más cortos? Con un gran búfer de envío y una conexión lenta, el tiempo para transferir realmente todos los datos almacenados en el búfer podría ser sustancial, después de todo.

No estoy interesado en que me notifiquen del último byte enviado; Solo quiero que eventualmente lleguen al host remoto de la manera más confiable posible.

Los reconocimientos de la capa de aplicación no son una opción (el protocolo es HTTP y estoy escribiendo un pequeño servidor).