2013-05-15 12 views
5

Ich verwende boost::asio für eine Server/Client-Anwendung. Der Server akzeptiert nur jeweils eine Verbindung. Ich frage mich, was der beste Weg für den Server ist zu überprüfen, ob der Client noch verbunden ist.Boost ASIO: Wie kann ein Server wissen, ob ein Client noch verbunden ist?

Der Zweck davon ist, dass ich gerne wissen könnte, ob der Client abgestürzt ist, so dass ich neue Verbindungsversuche neu starten kann.

+0

Sie brauchen Herzschlag auf Anwendungsebene - es gibt keinen anderen zuverlässigen Weg. –

Antwort

3

In meiner Anwendung verwende ich folgende Flags und mein Lesevorgang kommt heraus, wenn der Client trennt. Bitte versuchen Sie es, wenn es in Ihrer Anwendung ist. Wenden Sie diese Flags direkt nach der Verbindung an.

in meinem Fall skt_TCP ist vom Typ 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

Das ist wirklich auf Ihrer Wahl des Protokolls abhängt.

einfachen Befehl Protokoll

Wenn Ihr Server-Protokoll wartet immer auf eine Nachricht von dem Client, werden Sie immer eine anhängige async_read für jeden Kunden verbunden haben. Dies sollte mit einem Fehler (EOF) zurückgegeben werden, wenn ein Client in irgendeiner Weise trennt.

Keep-Alive ist ein Ansatz wie oben erwähnt, aber ausstehende async_read Arbeit ist gut für diesen Zweck.

einfaches Ereignis-Protokoll

Ein einfaches Ereignis-Protokoll beinhaltet einen Client für Daten und der Server hören sendet es. In diesem Protokoll hat der Server keine Ahnung, ob der Client da ist, weil der Client lediglich die Daten akzeptiert und weiter wartet. Der Client sendet dem Server niemals irgendeine Nachricht.

Dies ist die Voraussetzung für Keep-Alive. async_write Operationen nicht auf die gleiche Weise fehlschlagen, die async_read tun, wenn ein Client bereits getrennt ist.

Es gibt andere Optionen, wie den Server haben immer eine ausstehende async_read Operation, die versucht, 1 Byte zu lesen. Dies wird fehlschlagen, wenn der Client die Verbindung zu der obigen Diskussion des einfachen Befehlsprotokolls trennt, aber niemals erfolgreich sein wird, weil der Client keine Daten über das Simple-Event-Protokoll sendet.

Verwandte Themen