2010-08-18 2 views
4

차단 연결을 수행하고 응답을 받으면 메시지를 처리하는 C++ 부스트 클라이언트가 있습니다. 나는 이상한 문제에 직면하고있다.차단을위한 C++ boost asio timeout 연결

tcp::resolver::query query(tcp::v6(), this->host, port,tcp::resolver::query::v4_mapped); 
iterator = resolver.resolve(query); 
socket = new tcp::socket(io_service); 
socket->connect(*iterator); 

ping6이 연결할 수 없지만 (IPV6이 활성화 된) 컴퓨터에 연결을 시도했습니다. 그래도 2 행에서 쿼리를 해결하는 동안 오류가 발생하지 않았습니다. 이 결과로 오류가 발생하기 전에 연결을 시도하는 데 너무 많은 시간이 걸립니다. 내 질문 : -

1) asio에서 차단 연결을 시간 초과 할 수 있습니까? 비동기 모드로 전환 할 수 없습니다.

2) 연결할 수없는 호스트를 해결하는 동안 어떻게 오류가 발생하지 않습니까?

어떤 조언은 ASIO 티켓 추적기 긴 discussion이있다,

답변

1

제한 시간 동기 방법에 대한 잘못된 장소 매우 도움이 될 것입니다.

작동의 비동기 모드로 전환 할 수 없습니다.

시간 제한 요구 사항을 감안할 때 매우 드물지만 코드의 나머지 부분을 게시하고 비동기 작업을 사용할 수없는 이유를 설명합니다.

+0

@ Sam .. 빠른 응답을 감사드립니다. 사실, 타임 아웃은 요구 사항이 아닙니다. 주요 문제는 연결할 수없는 호스트를 쿼리하는 동안 오류없이 반복기를 얻는 것입니다. 결과적으로 소켓에 오류가 발생하기 전에 약 5 분이 걸립니다. "도달 할 수없는 호스트로 소켓 작업을 시도했습니다." – confused

+0

아, IPV6 형식으로 hostname을 지정할 때이 동작을 추가하는 것을 잊어 버렸습니다. – confused

+0

tcp :: resolver :: iterator의 유효성을 기본 생성자 iterator와 비교하여 해결 호출 후에 확인하십시오. –

-1

이 질문을 받았을 때 ASIO는 OP가 필요로하는 것, 즉 블로킹 소켓 작업과 같은 블로킹 작업을 시간 초과하는 방법을 수행하는 방법에 대한 예제가 없다고 생각합니다. 이제 정확히 어떻게하는지 보여주는 예제가 있습니다. 이 예제는 오래 걸리지 만, 그것이 잘 설명되어 있기 때문입니다. ioservice를 '원샷'모드로 사용하는 방법을 보여줍니다.

저는 예제가 훌륭한 해결책이라고 생각합니다. 다른 솔루션은 이식성을 훼손하고 ioservice를 이용하지 않습니다. 이식성이 중요하지 않고 ioservice가 많은 오버 헤드처럼 보이는다면 - 당신은 ASIO를 사용해서는 안됩니다. 무엇을하든 iOService를 생성하게됩니다 (거의 모든 ASIO 기능이 동기화 소켓에 달려 있기 때문에).

ASIO example of timeout on blocking call

ASIO 설명서 업데이트, 그렇게해야하는 데 사용하는 '개는'ASIO의 일부를 극복하는 방법에 대한 새로운 예제를 확인하고있다.

+0

이 예제는 OP가 요청한 것이 아닌 비동기 작업에 관한 것입니다. 나는 그것이 누군가가이 대답을 downvoted 이유라고 생각합니다. – lepe

관련 문제