TCP-клиент не может прочитать все данные с чтением - PullRequest
0 голосов
/ 30 января 2020

У меня 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(). Что здесь не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...