C ++ асинхронный сетевой программирование
-
28-09-2019 - |
Вопрос
У меня есть несколько простых вопросов, у меня есть приложение клиент-сервер и данные, отправленные на проволоке.
Я хотел бы иметь возможность восстановить данные и обращаться с этим правильно.
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, повторяя процесс, пока у вас не будет достаточно байтов или что-то умирает.
Я не уверен, что вы имеете в виду под «Невозможно прочитать все». Два возможных значения приходят на ум:
- Сумма данных, которые доступны для чтения не заполняют структуру. В этом случае вы просто делаете еще один Read_async, чтобы дождаться дополнительных данных для прибытия.
- Структура не впитывает все эти данные, которые наступили. Stack TCP будет просто буфер непрочитанным данным, пока вы не дойдете, чтобы прочитать его.