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

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

本文关键字:跳跃 序列化 运动 zeromq 包含 何通过      更新时间:2023-10-16

我需要使用Zeromq通过网络发送LEAP运动框架。发送和接收功能似乎已经有效,但是我对发送的数据有疑问。
LEAP ::帧类包含一个序列化和Deserialze方法,该方法创建给定帧的字节字符串(或从字符串中重新创建帧)。
对于这个简单的示例,我在任何类或从客户端到服务器的其他类别中发送了字符串。
问题是字节字符串似乎在其中有一些 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 x110ýë裧 x1 x1až x3 x3 b2 b2 '3 n n xf xf re军x1dæx•á x12 xf r² b r¾ x15w/õ= x1d†| x6b* xf rôx x1a?x15èx5g¿ x1d |k7¾2! x15 x1fá x18c x18〜 x19 t‡ 0 p0_@àbw n x1b t8o x13u x13u x15( x12 x1b t x12 x1> b&lt;±? x117t x2

在服务器端以下到达:

s x1è x1d bòï了 x2 x110ýë裧 x1 x1až x3 x3 b2 b2 '3 n n xf xf re军x1dæx•á x12 xf r² b r¾ x15w/õ= x1d†| x6b* xf rôx x1a?x15èx5g¿ x1d |k7¾2! x15 x1fá x18c x18〜 x19 t‡

毫不奇怪,直到第一个 0到达服务器,毫不奇怪。有人知道解决方案以发送 0的字节阵列或另一种解决此问题的方法吗?
该解决方案应尽可能快,因为LEAP传感器每秒创建约100帧或更多帧(最多200帧),我需要尽可能多地获得它们。

预先感谢。

尝试初始化带有大小的消息。目前,您的memcpy已进入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);