Как отправлять запросы работникам ZeroMQ, когда маршрутизатор привязан к адресу inproc?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как отправлять запросы работникам ZeroMQ, когда маршрутизатор привязан к адресу inproc?

Сообщение Anonymous »

В настоящее время я работаю с существующей программой, использующей ZeroMQ, и она структурирована следующим образом:
  • Клиенты (REQ) — Маршрутизатор — Прокси — Дилер - Рабочие (REP)
  • Маршрутизатор привязан к inproc-адресу
  • Дилер привязан к TCP-адресу (0.0.0.0:5555)
  • Работники расположены удаленно.
Мне нужно отправлять запросы и получать ответы от работников в моей программе. , но я столкнулся с трудностями, поскольку маршрутизатор привязан к адресу inproc.
Предполагая, что я не могу изменить существующую программу, есть ли способ реализовать эту функциональность?
Текущую структуру можно проиллюстрировать следующей схемой:
Изображение

Текущая структура кода (C++) следующая:

Код: Выделить всё

#include 
#include 
#include 
#include 

#include 

#include 

void Proxy(zmq::context_t& context)
{
zmq::socket_t clients { context, zmq::socket_type::router };
zmq::socket_t workers { context, zmq::socket_type::dealer };

clients.bind("inproc://router");
workers.bind("tcp://0.0.0.0:5555");

zmq::proxy(clients, workers);
}

void Client(zmq::context_t& context)
{
using namespace std::chrono_literals;

zmq::socket_t socket { context, zmq::socket_type::req };

socket.connect("inproc://router");

for (;;)
{
socket.send(zmq::str_buffer("some request"));

zmq::message_t reply;

socket.recv(reply);

spdlog::trace("reply: {}", reply.to_string());

std::this_thread::sleep_for(1s);
}
}

void Worker(zmq::context_t& context) // actually located remotely
{
zmq::socket_t socket { context, zmq::socket_type::rep };

socket.connect("tcp://localhost:5555");

for (;;)
{
zmq::message_t request;

socket.recv(request);

spdlog::trace("request: {}", request.to_string());

socket.send(zmq::str_buffer("some reply"));
}
}

int main()
{
zmq::context_t context { 1 };

std::jthread proxy { Proxy, std::ref(context) };

std::vector workers;

for (int i = 0; i < 4; ++i)
{
workers.emplace_back(Worker, std::ref(context));
}

std::vector clients;

for (int i = 0; i < 4; ++i)
{
clients.emplace_back(Client, std::ref(context));
}

return 0;
}

Я пробовал разные методы, но ни один из них не работает должным образом.
Например, я создал структуру Маршрутизатор — Прокси — Дилер в моя программа подключила дилера к существующему адресу дилера (0.0.0.0:5555) и попыталась отправить запросы на маршрутизатор.
Хотя запрос был отправлен, похоже, что рабочие не получают запрос. (Используя Wireshark, я подтвердил, что запросы отправляются дилеру, но дилер не пересылает запросы работникам.)
Есть ли способ добиться этого без реализации связи через сокеты с нуля?
Спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/785 ... oc-address
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»