2013-05-15 18 views
5

Sto usando boost::asio per un'applicazione server/client. Il server accetta solo una connessione alla volta. Mi chiedo quale sia il modo migliore per il server per verificare se il client è ancora connesso.Boost ASIO: come può un server sapere se un client è ancora connesso?

Lo scopo di questo è che vorrei poter sapere se il client si è bloccato, in modo da poter ricominciare ad ascoltare i nuovi tentativi di connessione.

+0

Hai bisogno di un battito cardiaco a livello di applicazione - non c'è altro modo affidabile. –

risposta

3

Nella mia applicazione sto usando le seguenti bandiere e la mia lettura esce quando il client si disconnette. Si prega di provare se nella vostra applicazione. Applica questo flag subito dopo la connessione.

nel mio caso skt_TCP è di tipo boost::asio::ip::tcp::socket

int32_t accept_server_socket = skt_TCP.native_handle(); 

int32_t timeout = 8; 
int32_t cnt = 2; 
int32_t intverval = 2; 

// Added Keepalive flag 
boost::asio::socket_base::keep_alive opt_keep_alive(true); 
skt_TCP.set_option(opt_keep_alive); 
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout)); 
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt)); 
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPINTVL, &intverval, sizeof(intverval)); 
0

Questo in realtà dipende la vostra scelta del protocollo.

Simple Protocol Comando

Se il protocollo server attende sempre per un messaggio da parte del cliente, si avrà sempre un attesa async_read per ogni client connesso. Questo dovrebbe tornare con un errore (EOF) quando un client si disconnette in qualsiasi modo.

Keep-alive è un approccio come detto sopra, ma in attesa di async_read funziona correttamente per questo scopo.

Simple Event protocollo

un semplice protocollo evento comporta un client di ascolto per i dati e il server di invio esso. In questo protocollo, il server non ha idea se il client è lì, perché il client accetta solo i dati e continua ad aspettare. Il client non invia mai al server alcun messaggio di sorta.

Questo presenta il requisito per keep-alive. Le operazioni di async_write non falliscono nello stesso modo in cui lo fa async_read quando un client è già disconnesso.

Esistono altre opzioni, ad esempio se il server ha sempre un'operazione in sospeso async_read che tenta di leggere 1 byte. Ciò non riuscirà quando il client si disconnette simile alla precedente discussione sul Simple Command Protocol, ma non avrà mai esito positivo perché il client non invia i dati tramite Simple Event Protocol.

Problemi correlati