2010-03-09 9 views
9

Il server ha creato un socket e si è associato a una porta e ha avviato una discussione che è in loop per accettare la connessione. Qualche tempo dopo il ciclo si è interrotto a causa di un'eccezione che ha provocato l'uscita del thread, ma il socket è ancora limitato alla porta. Ora se il client fa una 'connessione' a questo server, ha successo. Come è possibile? Se capisco correttamente, 'connect' ritorna solo dopo che il server ha 'accept' sul socket di ascolto. Mi sto perdendo qualcosa qui?È possibile connettere la chiamata al ritorno del socket senza chiamare il server 'accept'?

risposta

17

Se ho capito bene, 'connect' restituisce solo dopo server non 'accetta' sul socket di ascolto. Mi sto perdendo qualcosa qui?

Sì. TCP stabilisce la connessione - l'handshake a 3 vie - sotto le copertine e la mette in una coda di connessione completata quando è pronta. Accept() restituisce la prossima connessione in attesa dal fronte di questa coda.

Dal punto di vista del cliente è "connesso" ma non parlerà con nessuno finché il server non accetta e non inizia l'elaborazione. Un po 'come quando si chiama un'azienda e vengono immediatamente messi nella coda di attesa. Sei "connesso" ma non ci sarà da fare fino a quando qualcuno non riprende e inizia a parlare.

Il tuo thread individuale potrebbe essere morto ma il processo è ancora attivo e il descrittore di file è ancora aperto, quindi TCP non sa cosa sta succedendo a livello di applicazione.

+3

La differenza tra la coda di attesa del servizio telefonico e una connessione TCP che non è stata ancora accettata() ed: qualsiasi byte inviato alla connessione TCP viene bufferizzato dal sistema operativo e ricevuto una volta che la chiamata ad accept() ha stato fatto. Sulla linea di attesa del sistema telefonico, qualsiasi cosa venga detta dal chiamante viene scartata. –

+0

Stavo discutendo se aggiungere questo, grazie. Ovviamente non c'è nulla da dire che il servizio telefonico * non * ti stia registrando mentre pensi di essere in attesa e sta trasmettendo musica. :) – Duck

+2

Vale anche la pena sottolineare che questo è ciò che il parametro 'backlog' per la chiamata' listen() 'è tutto - il backlog è il numero di connessioni che possono essere in quello stato connnected-but-not-accepted a ogni volta. – caf

4

Le prese collegate entrano in una coda in attesa che il processo di ricezione le accetti(). C'è un backlog limitato di questi, una volta raggiunto il sistema operativo inizierà a rifiutare le connessioni oa ignorarle.

+0

La mia domanda è quando ritorna la chiamata "connect"? Dopo che il server chiama "accetta" sul socket di connessione o quando va in ascolto con successo? Se il server non chiama "accept", possiamo aspettarci che "connect" nel client abbia successo? – kumar

+2

Non sei corretto, la connessione NON attenderà che il server chiami accept(). Aspetta solo una risposta dal sistema operativo, che generalmente accoda la richiesta. – MarkR

Problemi correlati