Мне нужно отправить скачкообразный кадр через сеть, используя 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 \ X1E \ x1d \ bÒϤ \ х2 \ x10ÝËè £ § \ х1 \ x1až \ х3 \ b2 \ «3 \ п \ XF \ REY {A \ x15Ì \ x1d«С
\ X1dæx • А \ x12 \ XF \ r² \ Ь \ R¾ \ x15w / õ = \ x1d † ³ {¿\ x1a \ XF \ Rw + С.Б. \ x15Ò0¡A \ x1dB-
\ X6b * \ XF \ ROX \ x1a \ x15è \ x5G¿ \ x1d |?! K7¾2 \ п \ XF \ Roe «Ua \ x15 £ Ic \ x1d6’GÂ
\ X15 \ x1fÁ \ x18C \ x18ÿÿÿÿÿÿÿÿÿ \ x1: \ X1B \ Цзы \ X1C»hª \ x1eÀ \ x11jÆaê’HIÀ
\ X19 \ т ‡\ 0p0_ @ ABW \ п \ X1B \ T8O \ x13U \ x15Õï \ x11Y \ х2 \ а;? Y = ²¿ \ x19fó ™ Æ<A²?
\ X12 \ X1B \ т \ x12 \ x1> \ б<±? \ X117T \ x2
На стороне сервера поступает следующее:
s \ X1E \ x1d \ bÒϤ \ х2 \ x10ÝËè £ § \ х1 \ x1až \ х3 \ b2 \ «3 \ п \ XF \ REY {A \ x15Ì \ x1d«С
\ X1dæx • А \ x12 \ XF \ r² \ б \ R¾ \ x15w / õ = \ x1d † ³ {¿\ x1a \ XF \ Rw + С.Б. \ x15Ò0¡A \ x1dB-
\ X6b * \ XF \ ROX \ x1a \ x15è \ x5G¿ \ x1d |?! K7¾2 \ п \ XF \ Roe «Ua \ x15 £ Ic \ x1d6’GÂ
\ X15 \ x1fÁ \ x18C \ x18ÿÿÿÿÿÿÿÿÿ \ x1: \ X1B \ Цзы \ X1C»hª \ x1eÀ \ x11jÆaê’HIÀ
\ X19 \ т ‡
Поэтому неудивительно, что на сервер поступают только символы до первого \ 0.
Кто-нибудь знает обходной путь для отправки байтового массива с \ 0 или другого способа решения этой проблемы?
Решение должно быть максимально быстрым, поскольку датчик скачка создает около 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);
Других решений пока нет …