2012-01-15 3 views
10

Qual è il modo consigliato di chiudere "garbatamente" un socket TCP?Chiudere correttamente una presa TCP

Ho imparato che close() ing prima della lettura() di tutti i dati rimanenti nel mio buffer host può causare problemi per l'host remoto (potrebbe perdere tutti i dati nel suo buffer di ricezione che è stato accodato, ma non è ancora stato letto dalla sua domanda). È corretto?

Quale sarebbe un buon approccio per evitare quella situazione? C'è un modo per dire all'API che non mi interessa davvero che i dati vengano persi a causa della mia ignoranza di eventuali dati bufferizzati rimanenti e della chiusura del socket?

Oppure devo considerare il problema a livello di protocollo dell'applicazione e utilizzare una sorta di segnale "fine della trasmissione" implicito o esplicito per far sapere all'altra parte che è sicuro chiudere un socket per la lettura?

+0

In che lingua? – Kiril

+0

prese Berkeley; Sto usando C, ma mi interessa il concetto generale. – lxgr

risposta

15

1) Chiama shutdown per indicare che non si scrivono più dati nella presa.

2) Continuare fino a read dal socket finché non si verifica un errore o la connessione è chiusa.

3) Ora close la presa.

Se non si esegue questa operazione, è possibile chiudere la connessione mentre sono ancora presenti dati da leggere. Ciò si tradurrà in una chiusura sgraziata.

+0

Ok, lo farò. Per curiosità: è davvero possibile che i dati che ho inviato all'host remoto potrebbero essere persi ignorando i dati nel mio buffer di ricezione e non solo i dati inviati dall'host a causa della chiusura abortiva? – lxgr

+1

Sì, i dati inviati * a * l'host remoto possono essere persi perché la chiusura abortiva può verificarsi prima che l'altro lato legga i dati. Non vuoi chiamare "chiudi" finché non sei sicuro che la connessione sia stata chiusa. –

+3

1) arresto (calzino, 1), 2) mentre (leggi (calzino, ...) = 0) 3) chiudi (calzino) È questo l'ordine? – ernesto