Protocollo per chiudere una connessione socket

3

Sto arrotolando il mio protocollo applicativo su TCP. Sto usando Linux e C. Mi chiedo se ci sia una sequenza consigliabile per chiudere una connessione socket.

Il client avvierà sempre la chiusura inviando una stringa appositamente creata; dì "CHIUDI". Mi piacerebbe ricevere una sorta di conferma dal server che ha visto la mia richiesta CLOSE, quindi forse ha bisogno di inviare una stringa speciale come "CLOSE_OK".

Ho visto anche le chiamate di sistema close () e shutdown (), ma non sono sicuro di come usarle. Ad esempio, se il client, dopo aver ricevuto "CLOSE_OK", esegue un arresto (OUTPUT) e quindi attende di ricevere una stringa di lunghezza zero? E se il server, dopo aver inviato "CLOSE_OK", emette close () e quindi considera il socket morto?

Spero ci sia una "best practice" su questo argomento che non ho ancora trovato ...

Grazie, Cap

    
posta Chap 22.04.2013 - 22:59
fonte

1 risposta

6

Se hai bisogno di un handshake a livello di applicazione (per esempio, per ottenere una conferma dall'altra parte che alcuni dati persistenti sono stati commessi), fallo usando i tuoi messaggi di protocollo CLOSE e CLOSE_OK . In effetti è necessario farlo a livello di applicazione (vedi il principio end-to-end). Ma dopo che entrambe le estremità della presa di corrente sono già d'accordo che la connessione, non perdere tempo o sforzi per chiudere con grazia una direzione della comunicazione, verificando che ciò sia accaduto, e poi con grazia l'altra estremità. Solo close() del socket da entrambe le estremità. A seconda del tempo, le sequenze TCP FIN e ACK possono o non possono verificarsi in sequenza o incrociarsi a vicenda sul filo, ma la tua applicazione non dovrebbe preoccuparsene. In ogni caso, solo close ing sarà la cosa più veloce che puoi fare.

shutdown è utile nei casi in cui hai davvero bisogno di segnalare che la comunicazione è finita in una direzione, ma l'altra direzione è ancora necessaria. Può essere utilizzato, ad esempio, da un client che sta parlando con un server che non invierà alcuna risposta fino a quando non avrà tutti i dati dal client, completo con un EOF alla fine. shutdown(SHUT_WR) fa sì che EOF avvenga senza dover chiudere l'intero socket (bidirezionalmente).

    
risposta data 22.04.2013 - 23:59
fonte

Leggi altre domande sui tag