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

标签 c++ zeromq leap-motion

我需要使用 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/

相关文章:

objective-c 头文件中的 C++ 类声明

Node.js 事件代理

python - try-except-finally 代码在线程应用程序中无法按预期工作

python - 导入错误 : No module named Leap

c++ - 更新功能中的跳跃 Action 播放声音(openframework)

c++ - Win32 C++ GUI - 获取输入文本并在另一个窗口中显示

c++ - 静态类数据成员的范围

c++ - Eigen 库中的稀疏稀疏积 A^T*A 优化

python - 本地网络中 Python 中的 RabbitMQ、ZMQ 和 Celery 之间的最佳选择是什么?

c# - 围绕光标绘制一个圆圈 (C#)