Как определить длину буфера на стороне клиента

0

У меня есть сервер, отправляющий многомерный массив символов

char buff1[][3] = { {0xff,0xfd,0x18} , {0xff,0xfd,0x1e} , {0xff,0xfd,21} }

В этом случае buff1 несет 3 сообщения (каждый из которых имеет 3 символа). На стороне сервера может быть несколько экземпляров буферов с сообщениями переменной длины (Примечание: каждое сообщение всегда будет иметь 3 символа). а именно

char buff2[][3] = { {0xff,0xfd,0x20},{0xff,0xfd,0x27}}

Как сохранить размер этих буферов на стороне клиента при компиляции кода.

  • 1
    Вы не можете (вы можете изменить свой протокол, чтобы решить отправлять размеры до содержимого). Вы рассматривали возможность использования текстового протокола, такого как JSON ?
  • 2
    Вы должны будете отправить размер по сети перед массивом. Или вы можете добавить завершающую последовательность.
Теги:
sockets

1 ответ

2

Сервер должен отправить информацию о длине (и любой другой структуре) сообщения с сообщением как часть сообщения.

Легкий способ сделать это - сначала отправить количество байтов в сообщении, а затем байты в сообщении. Часто вы также хотите отправить версию протокола (чтобы вы могли обнаружить несоответствия) и, возможно, даже заголовок идентификатора сообщения (чтобы вы могли отправлять более одного типа сообщений).

Если стремительная производительность не является целью (и вы говорите через сетевой интерфейс, который, как правило, медленнее, чем компьютеры: синтаксический анализ может быть достаточно дешевым, что вам все равно), используя протокол или формат более высокого уровня, иногда хорошая идея (json, xml, что угодно). Это также помогает с проблемами отладки, потому что вместо отладки вашего настраиваемого протокола вы можете отлаживать формат более высокого уровня.

Кроме того, вы можете отправить какой-либо знак, что последовательность завершена. Если есть значение, которое никогда не является допустимым элементом последовательности (например, 0,0,0), вы можете отправить это, чтобы сказать "больше данных". Или вы можете отправить каждый элемент заголовком, если он является последним элементом, или заголовок может сказать, что этот элемент не существует, а последний элемент был предыдущим.

  • 0
    как я должен подойти к этой проблеме с помощью C ++
  • 0
    Как упоминал Галик в другом комментарии, добавление завершающей последовательности или «специального сообщения» к отправляемым вами данным является еще одним жизнеспособным решением, в зависимости от ваших требований. На стороне клиента вы будете читать сообщения, пока не прочитаете «специальное сообщение» {0x00, 0x00, 0x00}. Тогда вы знаете, что больше никаких данных не ожидается. Конечно, это работает, только если вы на 100% уверены, что {0x00, 0x00, 0x00} не будет правильным сообщением. Кроме того, то, как вы подходите к этой проблеме, не зависит от вашего выбора языка программирования.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню