C++ 如何在C++;对于UDP?

C++ 如何在C++;对于UDP?,c++,udp,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 byt

我有这样一个字节数组:

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发送的一个较大映像,其上限为65535字节),然后将这些较小的块重新连接到一个连续数组中?

这样做的问题是UDP数据包可能会按顺序到达或丢弃。为此使用TCP;这就是它的用途。

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

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

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

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

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

明白了吗

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


另一方面,当您想要重新加入数组时,必须为整个过程分配足够的内存,然后使用像memcpy()这样的复制函数将到达的块复制到正确的位置。请记住,UDP可能无法按顺序交付,也可能无法交付所有内容。

您可能希望尝试一种基于消息的中间件,例如,将整个压缩映像作为一条消息提供,并让中间件异步运行,以尽可能快的速度管理重新交付。它提供了一个与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);

@理查德:你将无法实现一个比TCP运行速度更快的正确连接。打开TCP连接以通过初始大数据块发送,然后使用UDP进行更新(假设如果任何更新丢失或破坏,您可以从中恢复;UDP数据包可能丢失或破坏)。这就是需要这种低延迟的游戏服务器所做的——即声音文件等通过TCP传输,但玩家位置等通过UDP传输(即反击服务器)。理论上是这样的。实际上情况并非如此。@Richard:如果1整数被删除怎么办?(就像我说的,这是个难题)@richard别让他们取笑你;他们鼓励你一次重新发明tcp的一个功能,这样你就会意识到,当你想发送对单个数据包来说太长的东西时,tcp正是你所需要的最小开销,这就是它被发明的原因。@Joel,不一定,tcp有更多的开销(例如流量/拥塞控制),UDP还有一个额外的优势,即如果您在某个时候向多个客户端广播,则多播成为一种可能—在UDP上增加一点可靠性有其优势(一些商业消息传递协议采用这种技术—正是出于这个原因!)+1--当然,任何一方都无法检测到数据包是否出现故障或完全丢失。因此OP需要实现他/她自己的机制来处理这些任务。看看好的一面:他将学习很多指针算法,试图重新实现他自己的TCP实现。这是一个很好的观点。。。虽然我希望这不是我的支票账户,但他用这个取款:)另一种选择是使用SCTP:在一个连接中,您可以同时拥有可靠和不可靠的流。