如何让 Zeromq Proxy 更灵活?

问题描述

我想用zeromq搭建一个通讯库。

支持多发多收。

我认为 zermoq PUB/SUB 模式可以支持多接收器,但适用于多发送器。它可能需要像这样构建一个代理:

void RunExchangeinfoProxy() {
  zmq::context_t context(1);
  zmq::socket_t sub(context,ZMQ_XSUB);
  sub.bind("ipc://public_recv");
  zmq::socket_t pub(context,ZMQ_XPUB);
  pub.bind("ipc://public_send");
  zmq::proxy(sub,pub,NULL);    
}

让我解释一下:因为每个发送者(当然,zmq 中的 recver 都可以)必须绑定一个地址。

这意味着:与第一个绑定相同地址的下一个发送者将踢第一个。因为它绑定了这个地址,第一个发送者失去了这个地址的控制权。

所以,代理的作用是绑定两个固定地址(public_send 和 public_recv)。然后每个发送者连接到 public_send,recvers 连接到 public_recv。可以使多发送者和多接收者工作。

这是我的解决方案,在我的测试中,效果很好。

我的测试代码是:

// sender.cpp
int main() {
  // ZmqSender is a wrapper to wrap bind,create context,socket operation
  // MarketSnapshot is a self-defined struct,i didnt paste them here.
  ZmqSender<MarketSnapshot> *r = new ZmqSender<MarketSnapshot>("public_send","connect");
  std::string s;
  while (std::cin >> s && s != "quit") {
    MarketSnapshot shot;
    snprintf(shot.ticker,sizeof(shot.ticker),"%s",s.c_str());
    r->Send(shot);
    cout << "sending " << s << "" << endl;
  }
}

// recver.cpp
int main() {
  auto q = CreateRecver<ZmqRecver,MarketSnapshot>("public_recv");
  auto r = q.get();
  std::string s;
  while (true) {
    MarketSnapshot shot;
    r->Recv(shot);
    shot.Show(stdout);  // show is a print function of MarketSnapshot
  }
}

我启动代理,3 个发送者和 3 个接收者。发送和接收工作正常。

但问题是:

我需要先启动代理代码。然后发送方和接收方就可以工作了。

这可能不太好,因为我可能会忘记先启动代理。

所以,我想我可以将代理代码插入到发送者和接收者中。让他们在构建之前启动代理。

但是在这解决方案中:

  1. 每个发送者和接收者都会有另一个线程(代理线程)
  2. 我不知道多个代理是否会发生冲突。

如果有任何方法我可以用来检查代理是否正在运行。

但是我在 zmq 文档中没有找到这个东西。

那么,您有什么建议可以轻松构建多发送方和多接收方组件吗?

我想要的是一个sender和一个recver类,它们可以是独立的,并且可以正确发送msg。

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)