ZMQ C++ 发送和接收来自特定工作人员
ZMQ C++ Send and Receive from specific worker
我正在使用(客户端)REQ->ROUTER
(路由器)<-ROUTER
(worker)套接字方案。
我可以将客户端请求发送给特定的工作线程,但无法将响应发送回客户端,因为它是一个REQ
套接字,因此客户端挂起等待响应。
尝试了很多,但未能解决。
客户端.cpp
#include "zhelpers.hpp"
#include <string>
int main (int argc, char *argv[])
{
zmq::context_t context(1);
zmq::socket_t requester(context, ZMQ_REQ);
requester.setsockopt(ZMQ_IDENTITY,"M");
requester.connect("tcp://localhost:5559");
for( int request = 0 ; request < 10 ; request++) {
std::string cmd;
std::cin>>cmd;
s_sendmore (requester, "B");//addressing workers
s_sendmore (requester, "");
s_send (requester, cmd);
s_dump(requester);
}
}
路由器.cpp
#include "zhelpers.hpp"
int main(int argc, char *argv[]) {
zmq::context_t context(1);
zmq::socket_t frontend(context, ZMQ_ROUTER);
frontend.setsockopt(ZMQ_ROUTER_MANDATORY, 1);
frontend.bind("tcp://*:5559");
zmq::pollitem_t items[] = {
{frontend, 0, ZMQ_POLLIN, 0}
};
while (1) {
zmq::message_t source;
zmq::message_t empty1;
zmq::message_t destination;
zmq::message_t empty2;
zmq::message_t message;
int more;
zmq::poll(&items[0], 1, -1);
std::cout << "DEBUG MSGS NOT PRINTING";// Another issue
if (items[0].revents & ZMQ_POLLIN) {
while (1) {
// Process all parts of the message
frontend.recv(&source);
frontend.recv(&empty1);
frontend.recv(&destination);
frontend.recv(&empty2);
frontend.recv(&message);
size_t more_size = sizeof(more);
frontend.getsockopt(ZMQ_RCVMORE, &more, &more_size);
frontend.send(destination, ZMQ_SNDMORE);
frontend.send(empty1, ZMQ_SNDMORE);
frontend.send(source, ZMQ_SNDMORE);
frontend.send(empty2, ZMQ_SNDMORE);
frontend.send(message);
if (!more)
break;
}}}
return 0;
}
此外,router.cpp
中的cout
语句不打印,原因未知?
工人.cpp
#include "zhelpers.hpp"
int main (int argc, char *argv[])
{
zmq::context_t context(1);
zmq::socket_t responder(context, ZMQ_ROUTER);
responder.setsockopt(ZMQ_IDENTITY, "B", 1);
responder.connect("tcp://localhost:5559");
while(1)
{
s_dump(responder);
sleep (1);
s_sendmore (responder, "B");
s_sendmore (responder, "");
s_sendmore (responder, "M");
s_sendmore (responder, "");
s_send (responder, "FromSlaveB");
}}
我使用的是 Ubuntu 16.04,当前 0MQ 版本是 4.0.5
更简单的部分 - 为什么cout
从不执行:
简单检查一下 ZeroMQ API 规范,就会知道:
int zmq_poll (zmq_pollitem_t *items, int nitems,
long timeout
);
...
如果超时值为 -1,则zmq_poll()
应无限期阻止,直到至少在一个zmq_pollitem_t
上发生请求的事件。
因此,为此,检查API文档就足够了(自v2.1.x早期发布以来,Martin SUSTRIK花费了一些非凡的时间)。
其余的都在REQ-ROUTER-ROUTER
为了简单起见,首先使用标准的,有据可查的场景启动和原型化任何软件 - 无论是REQ-REP
,XREQ-XREP
(== ROUTER-DEALER
)或任何其他记录的可扩展正式通信模式原型,然后再进入更复杂的多套接字和多方复合组合的阻塞和非阻塞高级消息传递和信令场景,形成一些期望的, 但高度先进的功能组合。
如果可能的话,在提出另一个未经测试或不支持的设置之前,阅读整本书,按照其他几个问题中的建议阅读整本书,而不是在掌握那些琐碎的用例之前跳入事情,本书有助于理解和构建。
费斯塔姆后:如果所谓的cout
出现问题,则不打印
1) 在下面
进行测试2)将观察到的输出作为另一个问题发布在 S/O#READYTOHELP
router_a_proof_of_print.cpp
#include "zhelpers.hpp"
int main( int argc, char *argv[] ) {
std::cout << "DEBUG: [PASS|FAIL] ON AN ATTEMPT TO PRINT"; // Another issue
return 0;
}
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- ZMQ C++ 发送和接收来自特定工作人员
- 如何:非根QML前端和根特性的工作人员线程
- 为什么我的工作人员线程未收到此信号
- 信号处理程序和图书馆工作人员线程
- 非CS人员需要了解线程是如何工作的,因为它与多核处理器有关
- 用于打印工作人员名称的If语句
- 超载*操作员只能与一个施工人员一起工作
- zmq呼吸机/工作人员/水槽模式与子流程一起不工作
- 在C++中将字符串转换为带完整有效数字的浮点值[修复了在开发人员C++中工作的问题]