Как создать сообщение определенного размера для отправки через сокет UDP в C ++? - PullRequest
0 голосов
/ 02 декабря 2019

Я пытаюсь написать небольшое приложение, которое «объединит» целую группу целочисленных переменных различных размеров (uint8, uint16, uint32) в 128-байтовое сообщение, которое будет отправлено через сокет UDP.

На принимающей стороне я хотел бы разделить сообщение обратно на отдельные целые числа и сохранить их для дальнейшей обработки. На данный момент я предполагаю, что порядковый номер не будет проблемой.

Могу ли я получить некоторые подсказки о том, как объединить переменные int и затем извлечь их из этого 128-байтового сообщения?

1 Ответ

0 голосов
/ 02 декабря 2019

Вы можете создать префикс символьного буфера, который будет предшествовать каждому целому числу, которое будет определять, какой тип целого числа читать, так что вы можете прочитать правильный размер определенного целого числа.

для примера: предшествовать каждомуцелое число с символом, представляющим целое число. Первый байт будет содержать символ, который вы будете интерпретировать как, это может быть любой символ ascii, который будет представлять целое число.

array == [byte] [byte-8bit] [byte] [2 byte-16 бит] [байт] [4 байта -32 бита] ...

UINT8 = 'a' UINT16 = 'b' UINT32 = 'c' или любой другой код, который вы хотите, чтобы ascii был ... Я использовал, b, c, так что это читаемый символ, который вы можете прочитать в отладчике

Затем вам нужно будет создать массив для отправки с префиксом, чтобы вы знали, какой размер делать при следующем чтении.

array = [a0b00c0000a0b00c0000] и так далее, вы можете построить массив, используя memcpy

Затем вы можете отправить весь пакет размером 128 байт

Убедитесь, что вы прочитали ровно 128 байт, а затемвы можете деконструировать, помните, что когда вы читаете, вы должны проверить сумму, прочитанную из сокета, и продолжать читать, пока не получите правильную сумму. - иногда чтение не возвращает правильное количество байтов, которое вы ожидаете.

Когда вы получаете пакет, вы можете деконструировать пакет, используя заголовки, и в зависимости от полученного заголовка вы можете удалитьправильное целое число и размер, а заголовки с правильным размером должны быть довольно легко деконструированы.

Также помните, что UDP с потерями, поэтому вы, возможно, потеряете пакеты

Теперь также помните, что если ваш построенныйпакет не равен точно 128 байтам каждый раз, когда вам нужно будет добавить еще один байт, который будет эквивалентен целому числу, которое точно скажет вам, сколько байт было отправлено ... 122..126..127 и т. д., и прочитайте его какпервый заголовок на другой стороне.

...