提升asio& ssl&错误代码

时间:2012-01-13 10:25:42

标签: c++ boost-asio

考虑此代码:

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)”行。

我在做错什么的任何线索?

2 个答案:

答案 0 :(得分:1)

在您的情况下,您的error_code变量不是指针,因此以下if语句

if (ec)
   break;
如果error_code确实存在,则

无法正确检查。

您需要执行此操作以检查是否存在error_code:

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

现在,当发生错误时,它将break正确。

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

答案 1 :(得分: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(),因为它返回一个指针(到函数)并且可以转换为bool。如果有错误,则返回指向unspecified_bool_true的指针,该指针不为空。因此它可以正常工作,并不能解决问题。