我需要使用ZeroMQ通过网络发送跳跃运动帧。
发送和接收功能似乎已经起作用,但我发送的数据有问题
Leap :: Frame类包含一个serialize和一个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位(以粗体突出显示):
取值\ X1E \ X1D \bÒϤ\ X2 \x10ÝË裧\ X1 \x1až\ X3 \ B2 \“3 \ n \ XF \ REY {A \x15Ì\ X1D“C \x1dæx•A \ X12 \ XF \ R 2 \ B \r¾\ x15w / O = \ X1D†³{¿\ X1A \ XF \ RW + SB \x15Ò0¡A\ x1dB- \ X6B * \ XF \ ROX \ X1A \x15è\x5G¿\ X1D?|!k7¾2\ n \ XF \鱼子“UA \ X15£IC \x1d6'G \ X15 \x1fÁ\ x18C \x18ÿÿÿÿÿÿÿÿÿ\ X1:\ X1B \姿\ X1C”hª\x1eÀ\x11jÆaê'HIÀ \ X19 \吨‡的 \ 0 p0_ @ ABW \ n \ X1B \ t8O \ x13U \x15Õï\ x11Y \ X2 \一个; Y =²¿\x19fó™Æ&LT;A²? \ X12 \ X1B \吨\ X12 \ X1&GT; \ b将?±\ x117T \ X2
在服务器端,以下内容到达:
取值\ X1E \ X1D \bÒϤ\ X2 \x10ÝË裧\ X1 \x1až\ X3 \ B2 \“3 \ n \ XF \ REY {A \x15Ì\ X1D“C \x1dæx•A \ X12 \ XF \ R 2 \ B \r¾\ x15w / O = \ X1D†³{¿\ X1A \ XF \ RW + SB \x15Ò0¡A\ x1dB- \ X6B * \ XF \ ROX \ X1A \x15è\x5G¿\ X1D?|!k7¾2\ n \ XF \鱼子“UA \ X15£IC \x1d6'G \ X15 \x1fÁ\ x18C \x18ÿÿÿÿÿÿÿÿÿ\ X1:\ X1B \姿\ X1C”hª\x1eÀ\x11jÆaê'HIÀ \ X19 \吨‡
所以不出所料只有字符直到第一个\ 0到达服务器。 有没有人知道一个变通方法来发送一个带有\ 0的字节数组或其他解决这个问题的方法? 解决方案应该尽可能快,因为闰传感器每秒创建大约100帧或更多(最多200),我需要尽可能多地获得它们。
提前致谢。
答案 0 :(得分:1)
尝试使用大小初始化您发送的邮件。目前您的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);