Вопрос

У меня есть несколько простых вопросов, у меня есть приложение клиент-сервер и данные, отправленные на проволоке.

Я хотел бы иметь возможность восстановить данные и обращаться с этим правильно.

struct T1
{
   int id;
   int foo;
};

struct T2
{
  int id;
  char foo;
  int bar;
};

Давайте возьмем эти структуры, их отправляются в сеть, предшествующую INT, который будет расскажет, следует ли либо T1 или T2. Если клиент отправит мне T1, то отправляет мне T2, у меня есть уверенность в том, что я могу прочитать полную структуру с Asio :: IP :: TCP :: Socket.Async_read ()? Я хотел бы настроить обработчик, который будет справиться с одним структурой, однако что произойдет, если я не могу прочитать все в одном async_read ()?

Асинхронная операция будет продолжаться до тех пор, пока не будет верно одно из следующих условий:

  • Поставляемые буферы заполнены. То есть байты перенесены равны сумме размеров буферов.
  • Произошла ошибка.

Отказнется ли это данные, которые не могут быть прочитаны? Это заставит еще один async_read? И, я уверен, что Async_read будет получать только один идентификатор + структуру только, если мой клиент отправит мне последовательно ID + структуру? Или пусть ОС оптимизирует вещи и поставит их как в том же пакете? Как вы могли видеть, я немного запутался, я бы хотел принимать правильные решения при разработке сервера / клиентской приложения, любая помощь будет оценена.

Спасибо.

Это было полезно?

Решение

Редактировать: Благодаря @timo за выяснение ошибки. async_read не будет завершен до тех пор, пока не будет читаться всю структуру, поэтому вам не нужно цикла. В противном случае мой ответ одинаково. Ничто не будет потеряно, независимо от того, как протокол TCP разрывается или объединяет данные.

Если в буферах TCP недостаточно заполнить ваш входной буфер, чтение просто будет получать все возможное, и сообщить о количестве BYTES FETCHED. Что происходит дальше, зависит от вас. У вас могут быть достаточно данных в Feetched Bytes, чтобы решить, что вы не хотите продолжать, поэтому Asio не делает допущений. Если вы еще не прочитали BYTES, чтобы содержать полную структуру, а затем инициируйте еще один async_read, повторяя процесс, пока у вас не будет достаточно байтов или что-то умирает.

Я не уверен, что вы имеете в виду под «Невозможно прочитать все». Два возможных значения приходят на ум:

  1. Сумма данных, которые доступны для чтения не заполняют структуру. В этом случае вы просто делаете еще один Read_async, чтобы дождаться дополнительных данных для прибытия.
  2. Структура не впитывает все эти данные, которые наступили. Stack TCP будет просто буфер непрочитанным данным, пока вы не дойдете, чтобы прочитать его.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top