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

Ric*_*nop 11 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);
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*eal 42

这样做的问题是UDP数据包可以到达或订购,或被丢弃.为此使用TCP; 这就是它的用途.

  • @Richard:你无法实现正确执行此操作的连接,这种连接的运行速度比TCP快.打开TCP连接以通过初始大块发送,然后使用UDP进行更新(假设如果任何更新丢失或损坏,您可以从中恢复; UDP数据包可能丢失或被破坏).这就是需要这种低延迟的游戏服务器 - 即声音文件等通过TCP传输,但播放器位置等通过UDP传输(即CounterStrike服务器). (23认同)
  • @richard不要让他们取笑你; 他们一直在努力重新发明tcp一个功能,所以你意识到tcp正是你想要发送一个太长的东西而不需要单个数据包所需的最小开销,这就是它被发明的原因. (10认同)
  • @Joel,不一定,TCP有更多的开销(例如流量/拥塞控制),UDP具有额外的优势,如果在某些时候你正在向多个客户端广播,多播成为可能 - 添加一点点有好处UDP的可靠性(一些商业消息传递协议采用这种技术 - 出于这个原因!) (6认同)
  • 理论上是真的.在实践中不那么重要. (2认同)
  • @Richard:如果1个整数被删除怎么办?(就像我说的,这是一个难题) (2认同)

Joe*_*sky 13

您不必"拆分"数组.你只需要指出它的不同部分.

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

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

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

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

得到它?

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

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

  • 看看光明的一面:他将学习很多有关指针算法的知识,试图重新实现他自己的TCP实现. (13认同)