C ++ асинхронное сетевое программирование - PullRequest
0 голосов
/ 25 ноября 2010

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

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

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 +, если мой клиент отправит мне последовательно структуру ID +?Или ОС может оптимизировать вещи и поместить их в один пакет?Как вы, наверное, видели, я немного растерялся, я хотел бы принимать правильные решения при разработке серверного / клиентского приложения, любая помощь будет принята с благодарностью.

Спасибо.

1 Ответ

1 голос
/ 25 ноября 2010

РЕДАКТИРОВАТЬ: Спасибо @timo за указание на ошибку. async_read не завершится, пока не будет прочитана вся структура, поэтому вам не нужно выполнять цикл. В противном случае мой ответ тот же. Ничто не будет потеряно, независимо от того, как протокол TCP разбивает или объединяет данные.

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

Я не уверен, что вы подразумеваете под "неспособностью прочитать все". на ум приходят два возможных значения:

  1. Объем данных, доступных для чтения, не заполняет структуру. В этом случае вы просто выполняете еще один read_async, чтобы дождаться поступления новых данных.
  2. Структура не поглощает все поступившие данные. Стек TCP будет просто буферизовать непрочитанные данные, пока вы не приступите к их чтению.
...