В чем смысл слова boost :: asio :: placeholder :: bytes_transferred - PullRequest
3 голосов
/ 20 июня 2011

Что означает boost::asio::placeholders::bytes_transferred в async_read_until()? В функции обратного вызова он возвращает меньшее значение, чем streambuf.size(). streambuf было ясно до обратного вызова. Подводя итог, ... bytes_transferred - это не фактическое количество байтов, прошедших через сокет, а меньшее. Я все это неправильно понял или как?

РЕДАКТИРОВАТЬ: Я прочитал следующий протокол из сокета:

Y43,72,0,,91009802000000603=0000000000000000000

"Y43," - заголовок.
"Y" - это тип сообщения.
"43" - дополнительные байты для чтения
"," - разделитель. Заголовок до первого встреченного символа ",".

Мой код для чтения похож на:

void handle_write(const boost::system::error_code& error,
                  size_t bytes_transferred)
{
    if (!error)
    {
        boost::asio::async_read_until(
            socket_,
            inputStreamBuffer_,
            ',',
            boost::bind(
                &client::handle_read1, this,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred
            )
        );
    }
    else
    {
        std::cout << "Write failed: " << error << "\n";
    }
}

void handle_read1(const boost::system::error_code& error,
                  size_t bytes_transferred)
{
    cout << "bytes_transferred=" << bytes_transferred << endl;

    if (!error)
    {
        cout << "0 size=" << inputStreamBuffer_.size() << endl;
        istream is(&inputStreamBuffer_);
        char c[1000];
        is.read(c,bytes_transferred);
        c[bytes_transferred]=0;
        for (int i=0;i<bytes_transferred;++i)
        {
            cout << dec << "c[" << i << "]=" << c[i] << " hex=" << hex << static_cast<int>(c[i]) << "#" << endl;
        }
    }
    else
    {
        std::cout << "Read failed: " << error << "\n";
    }
}

Для потока, отправленного с другой стороны:

Y43,71,0,,91009802000000595=0000000000000000000

Иногда я читаю это:

bytes_transferred=4
0 size=47
c[0]=Y hex=59#
c[1]=4 hex=34#
c[2]=3 hex=33#
c[3]=, hex=2c#

Для потока, отправленного с другой стороны:

Y43,72,0,,91009802000000603=0000000000000000000

Но иногда я читаю это:

bytes_transferred=7
0 size=47
c[0]= hex=0#
c[1]= hex=0#
c[2]= hex=0#
c[3]= hex=0#
c[4]=7 hex=37#
c[5]=2 hex=32#
c[6]=, hex=2c#

Сокет защищен с помощью SSL, а клиентские и серверные приложения являются слегка измененными примерами из boost_asio / example / ssl / *.

Во втором примере я теряю весь заголовок: (

Ответы [ 3 ]

4 голосов
/ 20 июня 2011

Есть четыре перегрузки функции, но давайте просто предположим, что используется первая. Если вы посмотрите документацию , то увидите, что bytes_transferred - это количество байтов, включая указанный разделитель.

И кроме того:

После успешной операции async_read_until streambuf может содержать дополнительные данные помимо разделителя. Приложение обычно оставляет эти данные в streambuf для последующей операции async_read_until для проверки.

3 голосов
/ 21 июня 2011

Решено. Я передавал std::string объект boost::asio::buffer() вместо std::string.c_str() при отправке ответа с сервера.

0 голосов
/ 20 июня 2011

Как показывают документы, вы должны иметь возможность игнорировать что-либо, кроме bytes_transferred, и просто вызвать async_read_until.

Однако, если вы используете совершенно новую реализацию SSL в ASIO 1.5.3 (который официально еще не является частью boost), вы можете столкнуться с той же проблемой, что и я (для которой я представил патч):

http://comments.gmane.org/gmane.comp.lib.boost.asio.user/4803

Не выглядиткак будто вы используете новую версию или сталкиваетесь с той же проблемой, но об этом следует знать, если вы столкнетесь с некоторыми ограничениями и соблазнитесь преимуществами новой реализации:

Новая реализациякомпилируется быстрее, показывает существенно улучшенную производительность и поддерживает пользовательское распределение памяти и вызов обработчика.Он включает в себя новые функции API, такие как обратные вызовы для проверки сертификатов, и улучшенные отчеты об ошибках.Новая реализация совместима с исходным кодом со старой для большинства применений.

...