В настоящее время я использую дизайн, когда сервер считывает первые 4 байта потока, а затем считывает N байтов после декодирования заголовков.
Но я обнаружил, что время между первым async_read и вторым чтением составляет 3-4 мс. Я только что напечатал временную метку консоли из callbacks для измерения. Я отправил всего 10 байтов данных. Почему так много времени нужно читать?
Я запускаю его в режиме отладки, но я думаю, что 1 соединение для отладки не так много, чтобы иметь задержку 3 мс между чтениями из сокета. Может мне понадобится еще один подход к сокращению потока TCP на "пакетах"?
ОБНОВЛЕНИЕ: Я размещаю код здесь
void parseHeader(const boost::system::error_code& error)
{
cout<<"[parseHeader] "<<lib::GET_SERVER_TIME()<<endl;
if (error) {
close();
return;
}
GenTCPmsg::header result = msg.parseHeader();
if (result.error == GenTCPmsg::parse_error::__NO_ERROR__) {
msg.setDataLength(result.size);
boost::asio::async_read(*socket,
boost::asio::buffer(msg.data(), result.size),
(*_strand).wrap(
boost::bind(&ConnectionInterface::parsePacket, shared_from_this(), boost::asio::placeholders::error)));
} else {
close();
}
}
void parsePacket(const boost::system::error_code& error)
{
cout<<"[parsePacket] "<<lib::GET_SERVER_TIME()<<endl;
if (error) {
close();
return;
}
protocol->parsePacket(msg);
msg.flush();
boost::asio::async_read(*socket,
boost::asio::buffer(msg.data(), config::HEADER_SIZE),
(*_strand).wrap(
boost::bind(&ConnectionInterface::parseHeader, shared_from_this(), boost::asio::placeholders::error)));
}
Как вы видите, отметки времени unix различаются в 3-4 мс. Я хочу понять, почему так много времени проходит между parseHeader и parsePacket. Это не проблема с клиентом, итоговые данные - 10 байт, но я не могу отправлять гораздо больше, а задержки - между вызовами. Я использую флеш-клиент версии 11. Что я делаю, просто отправляю ByteArray через открытый сокет. Я не уверен, что задержки на клиенте. Я отправляю все 10 байт одновременно. Как я могу отлаживать, где фактическая задержка?