2012-01-13 116 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变量是什么? – 2012-01-13 10:29:53

+2

@TonyTheLion如果到达“(1)”这一行,我想“ec变量”等于零。 – Charstar 2012-01-13 10:39:53

+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/)展示这个问题吗? – 2012-01-14 16:32:27

回答

1

在你的情况,你error_code变量不是指针,所以如果声明

if (ec) 
    break; 

不正确检查是否有ERROR_CODE实际存在以下。

你需要这样做,以检查是否存在一个ERROR_CODE:

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

现在,当发生了错误,它正确地将break

error_code的值可以是任何these错误条件,在enum内。

+1

你是否建议示例代码不能编译? error_code的布尔转换在很多例子中都有很好的描述和使用,包括[ssl客户端](http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/example/ssl/ client.cpp)。 – 2012-01-14 16:28:52

1

error_code.hpp你可以找到这样的定义:

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; 
    } 
    ... 
} 

如果使用这样的事情:

if (!ec) { 
    // no error 
} 

你会得到正确的行为,我希望这是明确的。当调用此:

if (ec) { 
    // error 
} 

你实际上调用operator unspecified_bool_type(),因为它返回一个指针(至函数),并且可以转换为布尔。如果有错误,则返回指向unspecified_bool_true的指针,该指针不为null。因此它能够正常工作,并且不会解决问题。