2014-01-27 3 views
3

Я знаю, что это может быть вообще глупый вопрос, но есть ли способ реализовать многостадийное чтение данных aсинхронизации в tcp где: a) мы читаем первые четыре байта - где байты 3 & 4 соответствуют к размеру оставшегося пакета b) мы читаем оставшийся пакет (данные) на основе его конечного размера с шага a.boost asio: чтение данных async

Я думаю об использовании с использованием async_read. Что-то вроде этого:

char hd_buf[3]; 

boost::asio::async_read(
    conn->getNetSocket(), 
    boost::asio::buffer(hd_buf, 3), 
    boost::bind(&TCPServer::handleHeaderRead, this, boost::asio::placeholders::error)); 

auto dt_sz = &hd_buf[2] + &hd_buf[3]; //nvm this part, it exists in handleHeaderRead 

char* dt_buf = new dt_buf[dt_sz]; 

boost::asio::async_read(
    conn->getNetSocket(), 
    boost::asio::buffer(dt_buf, dt_sz), 
    boost::bind(&TCPServer::handleDataRead, this, boost::asio::placeholders::error)); 

Я в целом правильно с такой реализацией дороги?

+1

Второй вызов 'async_read' должен выполняться из обработчика завершения первого вызова (т. Е.' HandleHeaderRead'); кроме этого не должно быть никаких проблем. –

+0

@MikeSeymour, за исключением, конечно, если вы выберете удобство сопрограммы с 'boost :: asio :: spawn' – sehe

+0

@MikeSeymour спасибо :) – Edgar

ответ

0

Да, большинство сетевого protocoles хранить динамический размер данных для передачи в поле фиксированного размера, которая приходит перед данными, например:

[ size ][ data... ] 
4bytes `size`bytes 

В общих заголовках имеет фиксированную длину, и длина блока данных внутри заголовка.

Смежные вопросы