gpt4 book ai didi

c++ - 如何通过zeromq发送包含\0的序列化跳跃运动帧?

转载 作者:行者123 更新时间:2023-11-28 05:24:14 24 4
gpt4 key购买 nike

我需要使用 ZeroMQ 通过网络发送跳跃运动帧。发送和接收功能似乎已经可以正常工作,但我在发送数据时遇到问题。
Leap::Frame 类包含一个序列化和一个反序列化方法,该方法创建给定帧的字节字符串(或从字符串重新创建帧)。
对于这个简单的例子,我发送的字符串没有被封装在任何类或其他东西中,从客户端发送到服务器。
问题是字节串中似乎有一些\0,因此只有第一个\0 到达服务器之前的数据。

客户:

int main(int argc, char** argv)
{
Leap::Controller controller;

zmq::context_t context = zmq::context_t(1);
zmq::socket_t client = zmq::socket_t(context, ZMQ_REQ);
client.connect("tcp://192.168.0.101:6881");

while(true)
{
Leap::Frame frame = controller.frame(0);
std::string frame_string = frame.serialize();
zmq::message_t message( frame_string.size() );
memcpy(message.data(), &frame_string, frame_string.size());
client.send(message);
}
return 0;
}

服务器:

int main(int argc, char** argv)
{
zmq::context_t context = zmq::context_t(1);
zmq::socket_t server = zmq::socket_t(context, ZMQ_REP);
server.bind("tcp://*:6881");

while(true)
{
zmq::message_t message;
server.recv(&message);
std::string frame_string(static_cast<char*>(message.data()), message.size());
Leap::Frame received_frame;
received_frame.deserialize(frame_string);
}
return 0;
}

这些是客户端序列化帧的前 200 个字符(单手帧的总大小约为 3700 个字符)。许多\0 中的第一个位于位置 149(以粗体突出显示):

s\x1è\x1d\bÒϤ\x2\x10ÝÈ裧\x1\x1až\x3\b2\"3\n\xf\rEÝ{Á\x15Ì\x1d“C\x1dæx•Á\x12\xf\r²\b\r¾\x15w/õ=\x1d†³{¿\x1a\xf\rw+ŠB\x15Ò0¡A\x1dB-\x6B*\xf\rôX\x1a?\x15è\x5G¿\x1d|k7¾2!\n\xf\rœ„ÚÂ\x15¯£ÍC\x1d6´GÂ\x15\x1fÁ\x18C\x18ÿÿÿÿÿÿÿÿÿ\x1:\x1b\tzù\x1c”hª\x1eÀ\x11jÆaê‘HIÀ\x19\t‡\0p0_@ÀBW\n\x1b\t8O\x13U\x15Õï?\x11Y\x2\a;Y=²¿\x19fó™Æ<IJ?\x12\x1b\t\x12\x1>\b<±?\x117T\x2

在服务器端到达以下内容:

s\x1è\x1d\bÒϤ\x2\x10ÝÈ裧\x1\x1až\x3\b2\"3\n\xf\rEÝ{Á\x15Ì\x1d“C\x1dæx•Á\x12\xf\r²\b\r¾\x15w/õ=\x1d†³{¿\x1a\xf\rw+ŠB\x15Ò0¡A\x1dB-\x6B*\xf\rôX\x1a?\x15è\x5G¿\x1d|k7¾2!\n\xf\rœ„ÚÂ\x15¯£ÍC\x1d6´GÂ\x15\x1fÁ\x18C\x18ÿÿÿÿÿÿÿÿÿ\x1:\x1b\tzù\x1c”hª\x1eÀ\x11jÆaê‘HIÀ\x19\t‡

所以不出所料只有第一个\0 之前的字符到达服务器。有没有人知道发送一个包含\0 的字节数组的变通方法或其他解决此问题的方法?
解决方案应该尽可能快,因为 leap 传感器每秒创建大约 100 帧或更多(最多 200),我需要获得尽可能多的帧。

提前致谢。

最佳答案

尝试用大小初始化您发送的消息。目前你的 memcpy'ing 到 msg.data() 但它没有被分配。

    zmq::message_t message( frame_string.size() );
memcpy(message.data(), frame_string.c_str(), frame_string.size());
client.send(message);

此外,当您收到一条消息时,您不需要使用大小对其进行初始化,recv 调用将为您调整其大小。

    zmq::message_t message;
server.recv(&message);

关于c++ - 如何通过zeromq发送包含\0的序列化跳跃运动帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40876911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com