如何通过 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);
我需要使用 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);