Как разбить и объединить массив в С++ для UDP?

У меня есть массив байтов:

lzo_bytep out; // my byte array
size_t uncompressedImageSize = 921600;

out = (lzo_bytep) malloc((uncompressedImageSize + 
          uncompressedImageSize / 16 + 64 + 3));
wrkmem = (lzo_voidp) malloc(LZO1X_1_MEM_COMPRESS);

// Now the byte array has 802270 bytes
r = lzo1x_1_compress(imageData, uncompressedImageSize,
        out, &out_len, wrkmem);

Как я могу разбить его на более мелкие части под 65535 байтами (массив байтов - это одно большое изображение, которое я хочу отправить через UDP, верхний предел которого составляет 65 535 байт), а затем присоединить эти маленькие куски к непрерывному массиву?

Ответ 1

Проблема с этим заключается в том, что UDP-пакеты могут выходить или заказываться или быть отброшены. Используйте TCP для этого; что за это.

Ответ 2

Вам не нужно "разбить" массив. Вы просто должны указать на разные части.

Предполагая, что вы используете типичную функцию UDP write(), она принимает несколько аргументов. Один из них - указатель на буфер, а другой - длина.

Если вы хотите получить первые 65535 байт, ваш буфер находится в wrkmem, а длина - 65535.

Для второго 65535 байт ваш буфер находится в wrkmem + 65535, а ваша длина равна 65535.

Третий 65535 байт, ваш буфер находится в wrkmem + 2 * 65535, а ваша длина - 65535.

Получите его?

(Тем не менее, другие плакаты верны. Вы должны использовать TCP).

С другой стороны, когда вы хотите повторно присоединиться к массиву, вы должны выделить достаточно памяти для всего, а затем использовать функцию копирования, такую ​​как memcpy(), чтобы скопировать прибывающие фрагменты в правильное положение. Помните, что UDP может не доставлять детали по порядку и может не доставлять их все.

Ответ 3

Возможно, вы захотите попробовать промежуточное программное обеспечение, основанное на сообщениях, например ØMQ и передать все сжатое изображение в виде одного сообщения, а промежуточное ПО запускать асинхронно и управлять возможна поставка с максимальной скоростью. Он предоставляет совместимый со стандартом BSD API и поэтому может легко переносить код и позволяет легко переключаться между различными базовыми транспортными протоколами по мере необходимости.

Доступны другие системы сообщений.

void my_free (void *data, void *hint)
{
    free (data);
}

    /*  ...  */

size_t uncompressedImageSize = 921600, compressedImageSize = 0;
size_t out_len = (uncompressedImageSize + uncompressedImageSize / 16 + 64 + 3);
lzo_bytep out = (lzo_bytep)malloc (out_len);
lzo_voidp wkrmem = (lzo_voidp)malloc (LZO1X_1_MEM_COMPRESS);
zmq_msg_t msg;

rc = lzo1x_1_compress (imageData, uncompressedImageSize,
                       out, &compressedImageSize, wrkmem);
assert (compressedImageSize > 0);
rc = zmq_msg_init_data (&msg, out, compressedImageSize, my_free, NULL);
assert (rc == 0);
/* Send the message to the socket */
rc = zmq_send (socket, &msg, 0);
assert (rc == 0);