如何在C ++ for UDP中拆分和连接数组?

时间:2010-12-28 20:51:08

标签: c++ 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);

如何将其拆分为65,535字节以下的较小部分(字节数组是一个大图像,我想通过UDP发送,其上限为65,535字节),然后将这些小块连接回连续数组?

3 个答案:

答案 0 :(得分:42)

执行此操作的问题是UDP数据包可能会到达或订购,或被丢弃。为此使用TCP;这就是它的用途。

答案 1 :(得分:13)

您不必“拆分”数组。你只需要指出它的不同部分。

假设您使用的是典型的UDP write()函数,它需要多个参数。其中一个是指向缓冲区的指针,另一个是长度。

如果要获取前65535个字节,则缓冲区为wrkmem,长度为65535。

对于第二个65535字节,缓冲区为wrkmem + 65535,长度为65535。

第三个65535字节,缓冲区为wrkmem + 2 * 65535,长度为65535。

得到它?

(也就是说,其他海报是正确的。你应该使用TCP)。

另一方面,当你想重新加入数组时,你必须为整个数据分配足够的内存,然后使用像memcpy()这样的复制函数将到达的块复制到正确的位置。请记住,UDP可能无法按顺序传送碎片,并且可能无法提供所有碎片。

答案 2 :(得分:1)

您可能希望尝试基于消息的中间件(如Ø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);