2011-05-11 2 views
7

네트워크 연결이 없을 때 내 네트워크 응용 프로그램을 로컬로 (서버와 클라이언트가 동일한 컴퓨터에서 실행되도록) 작동하려고합니다. 입니다 제가 현재 사용하고Asio의 호스트 이름 분석이 Linux에서 어떻게 작동합니까? NSS를 사용할 수 있습니까?

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' 
     what(): Host not found (authoritative) 
    Aborted 

코드 :

tcp::resolver::query query(host, PORT); 
    tcp::resolver::iterator endpointIterator = resolver.resolve(query); 
    tcp::resolver::iterator end; 

    boost::system::error_code error = boost::asio::error::host_not_found; 
    while(error && endpointIterator != end) 
    { 
    mySocket.close(); 
    mySocket.connect(*endpointIterator++, error); 
    } 
    if(error) 
    throw boost::system::system_error(error); 

나는했습니다 확신이 때때로 "그냥 작동"을 보이지만, 대부분의 시간은 내가 끝낼 문제를 ip::basic_resolver::resolve으로 줄이십시오. 그러나 Linux에서 구현 된 방법이나 내가 사용하고자하는 것이 무엇인지 파악할 수 없습니다. This 같은 문제가있는 것 같습니다. 전혀 어떤 조회를 수행하고 그냥 작동한다 127.0.0.1을 사용하지만

tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::address_configured | boost::asio::ip::resolver_query_base::numeric_host 

에 query 라인을 교체하려 할 때이 '일을 일부러 그냥 것으로 보인다. 필자가 실수로이 주소를 찾은 경우이라는 address_configured 플래그 (기본적으로 설정 됨)가 루프백 장치가 주소가있는 유일한 주소 인 경우 복귀하지 못하도록합니다. 다른 사람들에게 도움이되기를 바라는 마음으로이 질문을 게시하고 있지만 문제는 해결했습니다. 다른 사람들이 나는 그들이 서비스 이름을 조회 할 경우 사용하고 플래그를 (난 그냥 포트 번호를 사용하고) 싶지 않을 수도 있지만

는 지금은

tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::numeric_service); 

를 사용합니다.

답변

8

쿼리의 생성자에 루프백 장치가 주소가있는 유일한 장치 인 경우 주소를 반환하지 않는 address_configured 플래그가 기본적으로 설정되어있는 것이 문제였습니다. 설정 플래그를 0 또는 address_configured 이외의 다른 것으로 수정하면 문제가 해결됩니다. 이 앞으로이 문제에 사람을 도움이

tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::numeric_service); 

희망 : 여기 내가 성공적으로 지금 사용하고 있습니다 것입니다.

4

쿼리 생성자의 기본값은 "address_configured"플래그입니다.

IP : basic_resolver_query ::

만 비 루프백 IPv4 주소가 시스템에 구성되어있는 경우 IPv4를 해결 반환 address_configured. 시스템에 대해 루프백이 아닌 IPv6 주소가 구성된 경우에만 IPv6 주소를 반환하십시오.

플래그를 다른 플래그로 설정하면 작동하지만 플래그의 부작용도 있습니다. 이것을 피하려면 enum의 "default"를 사용하십시오.

tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::flags()); 

이전에는 0을 사용할 수 있었지만 서비스 이름으로 실수로 int를 사용하는 것을 방지하기 위해 라이브러리가 더욱 엄격 해졌습니다.

관련 문제