서버/클라이언트 응용 프로그램에 boost::asio
을 사용하고 있습니다. 서버는 한 번에 하나의 연결 만 허용합니다. 서버가 클라이언트가 여전히 연결되어 있는지 확인하는 가장 좋은 방법은 무엇입니까 궁금입니다.부스트 ASIO : 클라이언트가 아직 연결되어 있는지 서버가 어떻게 알 수 있습니까?
이 목적은 클라이언트가 충돌했는지 알 수 있기를 원하므로 새로운 연결 시도를 청취 할 수 있습니다.
서버/클라이언트 응용 프로그램에 boost::asio
을 사용하고 있습니다. 서버는 한 번에 하나의 연결 만 허용합니다. 서버가 클라이언트가 여전히 연결되어 있는지 확인하는 가장 좋은 방법은 무엇입니까 궁금입니다.부스트 ASIO : 클라이언트가 아직 연결되어 있는지 서버가 어떻게 알 수 있습니까?
이 목적은 클라이언트가 충돌했는지 알 수 있기를 원하므로 새로운 연결 시도를 청취 할 수 있습니다.
내 응용 프로그램에서 다음 플래그를 사용하고 클라이언트가 연결을 끊을 때 나의 읽기가 나타납니다. 신청서에 기재되어있는 경우 시험해보십시오. 연결 직후에이 플래그를 적용하십시오. 내 경우 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));
이다.
경우 간단한 명령 프로토콜, 당신은 항상 연결된 모든 클라이언트에 대한 보류중인 async_read
있을 것이다. 클라이언트가 어떤 식 으로든 연결을 끊으면 오류 (EOF)가 반환됩니다.
Keep-alive는 위에서 말한 접근 방식이지만이 목적으로는 async_read
의 작업이 유효합니다.
간단한 이벤트 프로토콜은 데이터를 전송하는 서버에 대해 듣고 클라이언트를 포함한다. 이 프로토콜에서는 서버가 클라이언트의 존재 여부를 알지 못합니다. 클라이언트가 데이터를 받아들이고 대기하기 만하기 때문입니다. 클라이언트는 서버에 아무런 메시지도 보내지 않습니다.
이렇게하면 연결 유지가 필요합니다. async_write
작업은 클라이언트가 이미 연결이 끊어진 경우 async_read
의 작업과 동일한 방식으로 실패하지 않습니다.
서버에 항상 1 바이트를 읽으려는 보류중인 async_read
작업이있는 것과 같은 다른 옵션이 있습니다. 클라이언트가 위의 단순 명령 프로토콜 토론과 유사하게 연결을 끊을 때 실패하지만 클라이언트가 단순 이벤트 프로토콜을 통해 데이터를 전송하지 않기 때문에 성공하지 못합니다.
응용 프로그램 수준의 심박동이 필요합니다. 신뢰할 수있는 다른 방법은 없습니다. –