2009-04-01 6 views
8

Situazione: il server chiama accept(). Il client invia un SYN al server. Il server riceve il SYN, quindi invia un SYN/ACK al client. Tuttavia, ora il client riaggancia/muore, quindi non invia mai un ACK al server.TCP e POSIX socket accetta() semantica

Cosa succede? Accept() restituisce non appena riceve il SYN o blocca fino a quando non viene restituito l'ACK del client? Se blocca, alla fine scade?

risposta

9

La chiamata ai blocchi accept() finché non ha una connessione. A meno che e fino a quando l'handshake a 3 vie non sia completo, non è una connessione, pertanto accept() non deve essere restituito. Per i socket non bloccanti non bloccherà, ma nemmeno ti darà informazioni sugli handshake parzialmente completati.

1

Alla fine scadrà, perché tale scenario è in realtà un DoS (Denial of Service) e la risorsa per l'accettazione restituita per l'utilizzo da parte del sistema operativo. se può causare il blocco del socket master, poiché il client è connesso al server una volta che accetta accetta con un file discriptor valido

Nel caso in cui si verifichi un errore durante la connessione dal client, verrà impostato il valore errno e una buona idea sarebbe log o visualizzare un messaggio di errore. , tuttavia, leggere le pagine man è la migliore fonte di informazioni nella maggior parte dei casi.

2

Se il client non invia mai un ACK, accept() bloccherà o restituirà EAGAIN se il socket è contrassegnato come non bloccante.

0

Nel caso in cui si verifichi un errore, ad esempio un timeout perché una stretta di mano non viene completata, restituisce -1 e imposta errno. Credo, dopo aver visto la pagina man, che imposterà errno su ECONNABORTED.