Что означает 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 / *.
Во втором примере я теряю весь заголовок: (