sockets — Простой пример FlatBuffer поверх ZeroMQ C ++ — Копирование struct в flatbuffer через zmq и обратно в struct

Я ссылался на некоторые Примеры и я моделирую свою систему от сервер а также клиент пример, и я чувствую, что я очень близок.

StarBuffer.fbs:
table StarBuffer {
radius: double;
mass: double;
volume: double;
}
root_type StarBuffer;

subscriber.cpp:

//
//  Durable subscriber
//
// Olivier Chamoux <[email protected]>

#include "zhelpers.hpp"#include <zmq.hpp>
#include "StarBuffer.h" // generated flat file from StarBuffer.fbs

struct Star {
double radius ;
double mass;
double volume;
};

int main (int argc, char *argv[])
{
zmq::context_t context = zmq::context_t(1);

//  Connect our subscriber socket
zmq::socket_t subSocket = zmq::socket_t(context, ZMQ_SUB);
subSocket.setsockopt(ZMQ_IDENTITY, "Hello", 5);
subSocket.setsockopt(ZMQ_SUBSCRIBE, "", 0);
subSocket.connect("tcp://localhost:5565");

//  Get updates, expect random Ctrl-C death
while (1) {
zmq::message_t receiveMessage;
subSocket.recv(&receiveMessage);

flatbuffers::FlatBufferBuilder fbb;
StarBufferBuilder builder(fbb);

auto star = GetStarBuffer(receiveMessage.data());

std::cout << "Received Star" << std::endl;
std::cout << "radius: " << star->radius() << std::endl;
std::cout << "mass: " << star->mass() << std::endl;
std::cout << "volume: " << star->volume() << std::endl;
}
return 0;
}

publisher.cpp:

//
//  Publisher for durable subscriber
//
// Olivier Chamoux <[email protected]>

#include "zhelpers.hpp"#include <zmq.hpp>
#include <random>
#include "StarBuffer.h" // generated flat file from StarBuffer.fbs

struct Star {
double radius ;
double mass;
double volume;
};

template<typename Numeric, typename Generator = std::mt19937>
Numeric random(Numeric from, Numeric to)
{
thread_local static Generator gen(std::random_device{}());

using dist_type = typename std::conditional
<
std::is_integral<Numeric>::value
, std::uniform_int_distribution<Numeric>
, std::uniform_real_distribution<Numeric>
>::type;

thread_local static dist_type dist;

return dist(gen, typename dist_type::param_type{from, to});
}Star getRandomStar() {
double lower_bound = 0;
double upper_bound = std::numeric_limits<double>::max();
double randomRadius = random(lower_bound, upper_bound);
double randomMass = random(lower_bound, upper_bound);
double randomVolume = random(lower_bound, upper_bound);

Star s = Star();
s.radius = randomRadius;
s.mass = randomMass;
s.volume = randomVolume;

return s;
}

int main () {

zmq::context_t context = zmq::context_t(1);

//  We send updates via this socket
zmq::socket_t publishSocket = zmq::socket_t(context, ZMQ_PUB);
publishSocket.bind("tcp://*:5565");

//  Now broadcast exactly 10 updates with pause
int update_nbr;
for (update_nbr = 0; update_nbr < 100; update_nbr++) {

Star randomStar = getRandomStar();

flatbuffers::FlatBufferBuilder fbb;
StarBufferBuilder builder(fbb);

builder.add_radius(randomStar.radius);
builder.add_mass(randomStar.mass);
builder.add_volume(randomStar.volume);

auto response = builder.Finish();
fbb.Finish(response);

std::cout << "Sending Star " << update_nbr << "…" << std::endl;
int buffersize = fbb.GetSize();
zmq::message_t request(buffersize);
memcpy((void *)request.data(), fbb.GetBufferPointer(), buffersize);
publishSocket.send(request);
std::cout << "Star sent!" << std::endl;

sleep(1);
}
return 0;
}

РЕДАКТИРОВАТЬ: код компилируется и работает! Я обновил код здесь, чтобы отразить мой рабочий код на моей локальной машине, чтобы люди могли использовать его в дальнейшем, так как это заняло у меня достаточно времени, чтобы закончить.

Так как мне понадобилось время, чтобы разобраться с этим, вот процесс сборки:

flatc --cpp StarBuffer.fbs
mv StarBuffer_generated.h StarBuffer.h
g++ -std=c++11 publisher.cpp -lzmq -o ./bin/zmq_pub
g++ -std=c++11 subscriber.cpp -lzmq -o ./bin/zmq_sub

Требуется zhelpers.cpp и flatbuffers / flatbuffers.h в вашем локальном каталоге.

0

Решение

Пытаться auto star = GetRootAsStarBuffer(request.data());, Create Вы использовали функцию для создания буфера, а не для чтения существующего.

Независимо от того, но на стороне письма, вы должны увидеть, если вы можете создать message_t без использования memcpy, который был бы более эффективным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]