У меня TCP-клиент и сервер, работающие на одной машине. Оба работают в режиме синхронной блокировки. Подключение подключиться и принять работает нормально.
Сервер:
socket = std::make_unique<boost::asio::ip::tcp::socket>(*io_service);
acceptor_ = std::make_unique<boost::asio::ip::tcp::acceptor>(
*io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),
port));
boost::system::error_code error_code;
acceptor_->accept(*socket, error_code);
if (error_code) return error_code;
// Initialize |buffer|.
// write 1
socket->write_some(
boost::asio::buffer(buffer.data(), buffer.size()), error_code);
if (error_code) {
return error_code;
}
auto data = GetData();
// Size of data is 722 bytes.
// write 2
socket->write_some(
boost::asio::buffer(data.data(), data.size()),
error_code);
клиент:
auto socket = std::make_unique<boost::asio::ip::tcp::socket>(*io_service);
boost::asio::ip::tcp::endpoint endpoint(
boost::asio::ip::address_v4::from_string(ip), port);
boost::system::error_code error_code;
socket->connect(endpoint, error_code);
if (error_code) {
return error_code;
}
// This data won't be read from server.
socket->write_some(boost::asio::buffer(buffer.data(), buffer.size()),
error_code);
// Read from write 1
boost::asio::streambuf buffer1;
boost::asio::read(*socket, buffer, boost::asio::transfer_at_least(8),
error_code);
buffer1.consume(8);
// Read from write 2
// Extract length from buffer1. |len_bytes|
boost::asio::read(*socket,
buffer1,
boost::asio::transfer_at_least(len_bytes),
error_code);
Считывание для записи 1 работает нормально. Однако запись 2 записывает 722 байта и считывает 2 блока, если я укажу 722 байта в обработчике завершения. Если я позвоню socket->available(error_code)
перед чтением 2, это даст 218. Если я дублирую запись 2, я получу 722 + 218 байтов. Я тоже попытался поставить sleep()
. Что здесь не так?