2012-01-13 1 views
4

:부스트 ASIO 및 SSL 및 오류 코드이 코드를 고려

const std::size_t rawBufferSize = 1024; 
char rawBuffer[rawBufferSize] = { 0 }; 
boost::asio::ssl::stream<boost::asio::ip::tcp::socket>* sslStream; 

... // initializing stuff 

boost::system::error_code ec; 
auto buffer = boost::asio::buffer(rawBuffer, rawBufferSize); 

for(; ;) 
{ 
    int readBytes = sslStream->read_some(buffer, ec); // I know that read_some return std::size_t (unsigned int)... 

    // here, readBytes equals -1 

    if (ec) 
     break; 

    ... (1) 
} 

어떻게이 "의 readBytes는"동일 -1 라인이 "(1)"에 도달 할 가능성이있다.

내가 뭘 잘못하고 있는지 실마리가 있습니까? 귀하의 경우에는

+1

readBytes = -1 일 때 error_code 변수에 무엇이 있습니까? –

+2

@TonyTheLion "(1)"행에 도달하면 "ec 변수"가 0이라고 가정합니다. – Charstar

+1

read_some은 0을 반환합니다 (오류 : http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/ssl__stream/read_some/overload2.html). -1이 아닙니다. 문제를 나타내는 [짧은, 자기 포함, 올바른 예] (http://sscce.org/)를 게시 할 수 있습니까? –

답변

1

, 당신의 error_code 변수는 포인터가 아니다, 그래서 ERROR_CODE가 실제로 존재하는 경우

if (ec) 
    break; 

이 제대로 확인하지 않습니다 if 문 다음.

당신은 ERROR_CODE 존재 여부에 대해 확인하기 위해이 작업을 수행 할 필요가 : 오류가 발생한 경우

이제
if (ec.value() != 0) break; 

, 그것은 break을 올바르게 것이다.

enum 안에 error_code 값은 these 오류 조건 중 하나 일 수 있습니다.

if (!ec) { 
    // no error 
} 

는 당신이 얻을 올바른 행동, 내가 분명히 희망 :이 같은 것을 사용하는 경우

class error_code 
{ 
    ... 

    typedef void (*unspecified_bool_type)(); 
    static void unspecified_bool_true() {} 

    operator unspecified_bool_type() const // true if error 
    { 
     return m_val == 0 ? 0 : unspecified_bool_true; 
    } 

    bool operator!() const // true if no error 
    { 
     return m_val == 0; 
    } 
    ... 
} 

:이 정의를 찾을 수 있습니다 error_code.hpp에서

+1

예제 코드가 컴파일되지 않는 것이 좋습니다? 오류 코드의 부울 변환은 [ssl client] (http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/example/ssl/) 등 많은 예제에서 잘 설명되어 사용됩니다. client.cpp). –

1

. 그것은 (기능)에 대한 포인터를 반환하기 때문에,

if (ec) { 
    // error 
} 

당신이 실제로 전화 operator unspecified_bool_type()하고는 부울로 변환 할 수 있습니다 : 당신이 전화를합니다. 오류가 있으면 NULL이 아닌 unspecified_bool_true에 대한 포인터를 리턴합니다. 따라서 올바르게 작동하고 문제가 해결되지 않습니다.