2013-05-15 3 views
5

Я использую boost::asio для сервера/клиентского приложения. Сервер принимает только одно соединение за раз. Мне интересно, как лучше всего проверить сервер, если клиент все еще подключен.Boost ASIO: Как сервер может знать, все еще подключен клиент?

Целью этого является то, что я хотел бы узнать, произошел ли сбой клиента, чтобы я мог перезапустить прослушивание новых попыток подключения.

+0

Вам нужно сердцебиение на уровне приложения - нет другого надежного способа. –

ответ

3

В моем приложении я использую следующие флаги, и мое чтение выходит, когда клиент отключается. Пожалуйста, попробуйте, если это в вашем приложении. Примените эти флаги сразу после подключения.

в моем случае skt_TCP имеет тип 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

Это действительно зависит от вашего выбора протокола.

Простой протокол командной

Если протокол сервера всегда ожидает сообщения от клиента, вы всегда будете иметь незавершенный async_read для каждого клиента, подключенного. Это должно возвратиться с ошибкой (EOF), когда клиент отключается каким-либо образом.

Keep-alive - это подход, как указано выше, но в ожидании работы async_read для этой цели.

Простой протокол событий

Простой протокол событий включает в себя клиент прослушивания данных и сервера, отправившего его. В этом протоколе сервер не знает, есть ли клиент, потому что клиент просто принимает данные и продолжает ждать. Клиент никогда не отправляет серверу никакого сообщения.

Это требование для поддержания жизни. Операции async_write не срабатывают так же, как async_read, когда клиент уже отключен.

Есть и другие варианты, например, если у сервера всегда есть ожидающая async_read операция, которая пытается прочитать 1 байт. Это не удастся, если клиент отключится аналогично обсуждению Simple Command Protocol выше, но никогда не преуспеет ни потому, что клиент не отправляет данные по протоколу Simple Event Protocol.

Смежные вопросы