2012-01-13 16 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変数」はゼロに等しいと仮定します。 – 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)。問題を示す[短く、自己完結型の、正しい例](http://sscce.org/)を投稿できますか? –

答えて

1

、あなたのerror_code変数がポインタではありませんので、ERROR_CODEが実際に存在している場合ならば、次の文

if (ec) 
    break; 

は正しくチェックしません。

あなたは、error_codeが存在するかどうかについて確認するためにこれを実行する必要があります。エラーが発生したとき

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

、それはbreakを正しくます。

error_codeの値は、theseのエラー条件のいずれかです(enum内)。

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へのポインタを返します。したがって、正しく動作し、問題は解決しません。

関連する問題