2009-04-01 15 views
8

Situación: El servidor llama a accept(). El cliente envía un SYN al servidor. El servidor obtiene el SYN y luego envía un SYN/ACK al cliente. Sin embargo, el cliente ahora cuelga/muere, por lo que nunca envía un ACK de vuelta al servidor.Sockets TCP y POSIX aceptar() semántica

¿Qué ocurre? ¿Acepta accept() tan pronto como recibe el SYN, o bloquea hasta que se devuelve el ACK del cliente? Si se bloquea, ¿finalmente se agota el tiempo de espera?

Respuesta

9

La llamada a los bloques accept() hasta que tenga una conexión. A menos que y hasta que se complete el handshake de 3 vías allí no hay conexión, por lo que accept() no debe regresar. Para las tomas sin bloqueo, no bloqueará, pero tampoco le dará información sobre los apretones de manos parcialmente completados.

1

Al final del tiempo de espera, porque ese escenario es en realidad una DoS (denegación de servicio) y el recurso para la aceptación volvió a ser utilizado por el sistema operativo. si puede causar que el socket maestro se bloquee, ya que el cliente está conectado al servidor una vez que el accept regrese con un descriptor de archivo válido

En caso de que ocurra un error durante la conexión del cliente, se establecerá el valor errno y una buena idea sería registrar o mostrar un mensaje de error. Sin embargo, lea las páginas man, es la mejor fuente de información en la mayoría de los casos.

2

Si el cliente nunca envía un ACK, accept() bloqueará o devolverá EAGAIN si el socket está marcado como no bloqueante.

0

En el caso de que haya una falla, por ejemplo, un tiempo de espera porque un saludo de manos no se completa, devolverá -1 y establecerá errno. Creo que, después de mirar la página del manual, establecerá errno en ECONNABORTED.

Cuestiones relacionadas