Domanda

Ho letto il riferimento asio boost, ho seguito il tutorial e ho esaminato alcuni degli esempi. Tuttavia, non riesco a vedere come un socket dovrebbe essere abbattuto:

  1. Devo chiamare close () o è fatto dal distruttore del socket?
  2. Quando dovrei chiamare shutdown ()
  3. Quali sono gli effetti di shutdown ()? Sono consapevole che disabilita "invia o riceve", ma come viene fatto? Cosa posso aspettarmi se invio o ricevo utilizzando il socket dopo che è stato disabilitato?
  4. Quali errori posso aspettarmi da close ()
È stato utile?

Soluzione

Dal momento che questa è una domanda multipla, farò del mio meglio per rispondere ad ogni parte con soddisfazione:

1) È stata la mia esperienza con i socket ASIO che il distruttore gestisce chiudendo il socket. Tuttavia, mi sono occupato solo dei socket TCP. Il modo migliore per verificarlo è semplicemente guardare il codice per il distruttore per vedere se fa qualcosa che assomiglia a una chiusura. So che il codice Boost può essere un po 'complicato da percorrere, quindi potrebbe essere più semplice creare semplicemente un piccolo programma di esempio che apre un socket UDP e quindi lo distrugge. In questo modo è possibile scorrere il codice in un debugger per seguire la logica.

Dato che i progettisti di Boost hanno tenuto conto di ciò per i socket TCP, ho difficoltà a immaginare che non farebbero lo stesso per i socket UDP.

2) Chiama shutdown () solo quando ritieni che sia necessario impedire a qualsiasi codice di eseguire un recv futuro e / o invia su la presa. In genere non è richiesto, anche se l'ho visto usato sui socket TCP per forzare il socket a inviare un RST quando è chiuso (al contrario dell'arresto predefinito "grazioso" dove vengono elaborati gli invii in sospeso ).

3) Puoi pensare ai socket come a una forma di comunicazione a due canali: uno per la lettura, l'altro per l'invio. Puoi chiudere l'uno indipendentemente dall'altro e puoi continuare a usare un canale quando l'altro è spento (cioè puoi ancora ricevere dopo lo spegnimento per l'invio e viceversa). Chiudere un socket è identico a chiamare shutdown sia su recv che su send.

La chiusura di recv impedisce semplicemente al tuo codice di leggere altri dati. Se si tenta di farlo, verrà visualizzato un errore socket. Allo stesso modo, se l'altro lato della connessione tenta di inviarti dati, riceverà un errore (scusami per passare di nuovo al mondo TCP, ma credo che un RST riceva risposta al mittente).

Anche la chiusura per l'invio impedisce al codice di inviare altri dati. Se la memoria mi serve correttamente, questo sembra identico a quello che succede quando si chiude un socket (un pacchetto di lunghezza zero viene inviato per segnalare all'altro lato che il particolare canale è stato chiuso). Eventuali tentativi futuri di invio restituiranno un errore.

4) Dovrai controllare i tuoi documenti per sapere con certezza. MSDN ti darà una buona indicazione, anche se non so che lo considererei autorevole.

Altri suggerimenti

Dagli esempi forniti sul sito Web Boost, sembra che si debba semplicemente usare close (). Ad esempio, guarda questo:

void connection::stop()
{
  socket_.close();
}

Tratto da questo indirizzo: Server HTTP

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top