문제

연결의 원격쪽에 소켓이 닫혀 있는지 확인하는 가장 쉬운 방법은 무엇입니까? socket::is_open() 원격쪽에 닫혀 있어도 진실을 반환합니다 (사용 중입니다. boost::asio::ip::tcp::socket).

스트림에서 읽고 성공했는지 확인할 수는 있지만 프로그램의 논리를 변경하여 이런 식으로 작동하도록해야합니다 (수표 지점에서 스트림에서 데이터를 추출하기를 원하지 않습니다. ).

도움이 되었습니까?

해결책

피어가 연결을 깨끗하게 닫으면 읽는 동안 EOF를 얻어야합니다. 그렇지 않으면 나는 일반적으로 연결이 실제로 살아 있는지 알아 내기 위해 핑을합니다.

다른 팁

그냥 확인하십시오 boost::asio::error::eof 당신의 오류 async_receive 매니저. 연결이 닫혔다는 것을 의미합니다. 이것이 바로이 작업을 수행하는 유일한 방법입니다.

부스트 엿보기 기능이 있습니까? 대부분의 소켓 구현에는 큐에서 데이터를 제거하지 않고 데이터를 읽을 수있는 방법이 있으므로 나중에 다시 읽을 수 있습니다. 이것은 귀하의 요구 사항을 충족시키는 것 같습니다.

ASIO 문서를 빠르게 살펴본 후에, 나는 내가 기대했던 것을 정확히 찾을 수 없었지만 그것이 존재하지 않는다는 의미는 아닙니다.

제안 할 것입니다 이것 우선.

일반적으로 소켓을 열면 소켓을 읽기 시작하고 절대로 멈추지 말아야한다고 생각합니다. 이렇게하면 서버 또는 클라이언트가 동기 및 비동기 프로토콜을 모두 지원할 수 있습니다. 클라이언트가 연결을 닫는 순간, 읽기가이를 알려주는 순간.

Error_Code 사용은 클라이언트가 연결되어 있는지 여부를 확인할 수 있습니다. 연결이 성공하면 error_code error.value ()가 0을 반환하면 다른 값을 반환합니다. error_code에서 message ()를 확인할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top