如何解决如何让 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 个接收者。发送和接收工作正常。
但问题是:
我需要先启动代理代码。然后发送方和接收方就可以工作了。
这可能不太好,因为我可能会忘记先启动代理。
所以,我想我可以将代理代码插入到发送者和接收者中。让他们在构建之前启动代理。
- 每个发送者和接收者都会有另一个线程(代理线程)
- 我不知道多个代理是否会发生冲突。
如果有任何方法我可以用来检查代理是否正在运行。
但是我在 zmq 文档中没有找到这个东西。
那么,您有什么建议可以轻松构建多发送方和多接收方组件吗?
我想要的是一个sender和一个recver类,它们可以是独立的,并且可以正确发送msg。
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。