【问题标题】:ZMQ C++ Send and Receive from specific workerZMQ C++ 从特定工作人员发送和接收
【发布时间】:2017-06-19 03:19:51
【问题描述】:

我正在使用 (Client)REQ->ROUTER(Router)<-ROUTER(Worker) Socket-scheme。

我可以将客户端请求发送给特定的工作人员,但无法将响应发送回客户端,因为它是一个 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 语句不打印,原因未知?

worker.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

【问题讨论】:

  • 您的调试消息在退出后甚至没有打印吗?你试过冲洗吗?您可以简单地添加std::endl 并尝试。示例:std::cout &lt;&lt; "Message" &lt;&lt; std::endl;
  • 请确保您将解决方案发布为答案,而不是更新您的问题。这是为了帮助未来的访客并避免混淆。谢谢。

标签: c++ sockets zeromq pyzmq jzmq


【解决方案1】:

更简单的部分 - 为什么cout 从不执行:

ZeroMQ API 规范的简要检查告诉您:

int zmq_poll (zmq_pollitem_t *items, int nitems,long timeout );
...
如果 timeout 的值为 -1,zmq_poll() 将无限期阻塞,直到至少一个 zmq_pollitem_t 上发生请求的事件。

因此,为此检查 API 文档就足够了(Martin SUSTRIK 自 v2.1.x 的早期版本以来已经花费了相当多的时间)。


其余在REQ-ROUTER-ROUTER

为了简单起见,首先使用标准的、有据可查的场景启动任何软件并对其进行原型制作 - 无论是 REQ-REPXREQ-XREP (== ROUTER-DEALER) 还是任何其他记录在案的可扩展正式通信模式原型,之前推进到阻塞和非阻塞高级消息传递和信令场景的更复杂的多套接字和多方复合组合,形成一些理想但高度先进的功能组合。

如果可能,请按照您的几个问题中的其他问题中的建议阅读整本书,然后再询问另一个未经测试或不受支持的设置,而不是在掌握那些琐碎的用例之前不要跳入书籍有助于理解和构建。


Post Festum:如果出现所谓的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;
}

【讨论】:

  • 但我的用例是我需要将消息路由到特定的工作人员,并在工作人员完成后将响应返回给客户端。
  • 即使我将 std:cout 消息放在 router.cpp 中的任何位置,它也不会打印。
  • std::cout 并不是真正的问题。我使用 std::cerr 调试消息,效果很好。
  • 对,也确信上面的声明,关于 (cit.) “即使我将 std:cout 消息放在任何地方......,它也不会打印”是错误的,但 StackOverflow 是基于 MVCE 证明的,所以我们开始了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多