2013-05-15 3 views
5

서버/클라이언트 응용 프로그램에 boost::asio을 사용하고 있습니다. 서버는 한 번에 하나의 연결 만 허용합니다. 서버가 클라이언트가 여전히 연결되어 있는지 확인하는 가장 좋은 방법은 무엇입니까 궁금입니다.부스트 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의 작업과 동일한 방식으로 실패하지 않습니다.

서버에 항상 1 바이트를 읽으려는 보류중인 async_read 작업이있는 것과 같은 다른 옵션이 있습니다. 클라이언트가 위의 단순 명령 프로토콜 토론과 유사하게 연결을 끊을 때 실패하지만 클라이언트가 단순 이벤트 프로토콜을 통해 데이터를 전송하지 않기 때문에 성공하지 못합니다.

관련 문제