Повысьте asio & ssl & код ошибки - PullRequest
4 голосов
/ 13 января 2012

Учитывая этот код:

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 ]

1 голос
/ 07 июня 2012

В 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, который не является нулевым.Поэтому он работает правильно и не решит проблему.

1 голос
/ 13 января 2012

В вашем случае переменная error_code не является указателем, поэтому следующий оператор if

if (ec)
   break;

НЕ проверяет правильно, действительно ли существует код ошибки.

Это необходимо сделать, чтобы проверить, существует ли код ошибки:

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

Теперь, когда произошла ошибка, она будет break правильно.

Значение кода ошибки может быть любым из этих условий ошибки внутри enum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...