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

How to send a serialized leap motion frame containing \0's via zeromq?

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