2012-04-05 5 views
2

asio를 사용하는 비동기 TCP/IP 클라이언트가 있습니다. 연결이 끊어지면 async_read의 내 핸들 함수가 오류를 수신합니다. 그래서 연결이 끊어 졌다는 소식을 듣습니다.boost asio : tcp 연결이 활성 상태인지 모니터링하는 방법

이제는 추상 인터페이스가이 시퀀스를 적용하는 동기 TCP/IP 클라이언트를 구현하는 일부 레거시 코드를 리팩토링하고 있습니다. 동기 쓰기, 동기 읽기입니다. asio로 작업하는 것이 매우 쉽지만, 연결이 끊어지면 비동기 적으로 알고 싶습니다.

보다 더 우아한 방법이 있나요 :

옵션 A : 소켓이 아직 살아 있다면 (확인 스레드를 추가 읽으려고하여 ...하지만 어떻게 읽기가 확신 할 수 있습니다 ?

옵션 B) Boost asio ip tcp iostream Error Detection를 참조하십시오 내 동기 읽기에서 데이터를 도용하지 않습니다 사용 대신 async_read과와 동기가

을 읽을 모방
+0

나는 대답이 '아니오'라고 생각합니다. 어쩌면 몇 가지 플랫폼 특정 솔루션이 있습니다. – mirk

+0

특정 시간 프레임 내에 전송 된 패킷에 대한 확인 응답을받지 못하면 TCP 프로토콜이 연결 실패를 감지 할 수 있다고 생각하지 않습니다. – Ferruccio

+0

옵션 B를 구현했습니다. 이해할 수없는 두 가지 사항이 있습니다 1. 단선이 감지되지 않고 2. 프린터 (즉 프린터)의 이더넷 케이블이 연결되어 있지 않으면 데이터를 보낼 수 있습니다 오류를 반환하지 않습니다. 두 번째 시간에만 오류가 발생합니다 – DoogQc

답변

2

나는 SYN 상상 것 비동기식 동작처럼 실패합니다. 동기화 된 하나가 실패 할 때 시간이 매우 오래 걸리고 다른 모든 것이 그걸 기다려야 할 때 훨씬 더 눈에 띄기 때문에 파격적 일 수 있습니다.

소켓에 TCP 연결 유지 기능을 설정하고 TCP 연결 유지 간격을 낮추어 더 빨리 연결 유실을 감지 할 수 있습니다.

+0

언급할만한 가치가 있습니다. TCP-keepalive에는 몇 가지 제한이 있습니다. 가장 중요한 것은 keepalive의 시간 제한을 설정할 수있는 휴대용 방법이 없다는 것입니다. 또한 기본 시간 제한은 매우 큽니다. 예를 들어, Linux에서 기본 킵 얼라이브 간격은 2 시간이며 연결이 끊어지기 전에 9 개의 프로브가 실패해야합니다. – Rawler

+0

대부분의 경우, 응용 프로그램 코드에서 연결 시간 제한을 처리하고, 가능한 경우 프로토콜에 "하트 비트"를 추가하고, 시간 초과에 대한 정상 기본값을 파악하려고 노력해야합니다. ("이 작업은 실제로 5 초가 걸릴 까?"등) – Rawler

관련 문제