Domanda

Qual è il modo più semplice per verificare se un socket è stato chiuso sul lato remoto della connessione? socket :: is_open () restituisce true anche se è chiuso sul lato remoto (sto usando boost :: asio :: ip :: tcp :: socket ) .

Potrei provare a leggere dallo stream e vedere se ha successo, ma dovrei cambiare la logica del mio programma per farlo funzionare in questo modo (non voglio che i dati vengano estratti dallo stream nel punto del controllo).

È stato utile?

Soluzione

Se la connessione è stata chiusa in modo pulito dal peer dovresti ottenere un EOF durante la lettura. Altrimenti in genere eseguo il ping per capire se la connessione è davvero attiva.

Altri suggerimenti

Controlla l'errore boost :: asio :: error :: eof nel tuo gestore async_receive . Significa che la connessione è stata chiusa. Questo è l'unico modo corretto per farlo.

È disponibile una funzione boost peek? La maggior parte delle implementazioni di socket ha un modo per leggere i dati senza rimuoverli dalla coda, in modo da poterli leggere di nuovo in seguito. Questo sembrerebbe soddisfare le tue esigenze.

Dopo aver dato una rapida occhiata ai documenti di asio, non sono riuscito a trovare esattamente quello che mi aspettavo, ma ciò non significa che non ci sia.

Suggerirei questo per i principianti.

Penso che in generale una volta aperto un socket, dovresti iniziare a leggerlo immediatamente e non smettere mai di farlo. In questo modo puoi rendere il tuo server o client in grado di supportare sia i protocolli sincroni che asincroni. Nel momento in cui il client chiude la connessione, nel momento in cui la lettura ti dirà questo.

L'uso di error_code è in grado di verificare la condizione se il client è connesso o meno. Se la connessione ha esito positivo, error_code error.value () restituirà 0, altrimenti restituirà un altro valore. Puoi anche controllare il messaggio () da error_code.

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