Как отправить сериализованный кадр скачка движения, содержащий \0, через zeromq?

Мне нужно отправить скачкообразный кадр через сеть, используя 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 \ 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 p0_ @ À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 или другого способа решения этой проблемы?
Решение должно быть максимально быстрым, поскольку датчик скачка создает около 100 кадров или более (до 200) в секунду, и мне нужно получить как можно больше из них.

Заранее спасибо.

1 ответ

Решение

Попробуйте инициализировать отправленное вами сообщение с размером. В настоящее время ваши 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);
Другие вопросы по тегам