ZMQ C ++从特定工作人员发送和接收

时间:2017-06-19 03:19:52

标签: c++ sockets zeromq pyzmq jzmq

我正在使用(客户端)REQ->ROUTER(路由器)<-ROUTER(工作人员)套接字方案。

我可以将客户端请求发送给特定的工作人员,但无法将响应发送回客户端,因为它是 REQ 套接字,因此客户端挂起等待回应。

尝试了很多但未能解决。

Client.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);
    }
}

router.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;
}

cout中的 router.cpp 语句不打印,原因未知?

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

1 个答案:

答案 0 :(得分:1)

更简单的部分 - 为什么cout永远不会执行:

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

  

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

因此,检查API文档就足够了(自从早期发布v2.1.x以来,Martin SUSTRIK已经花了很多时间)。

其余的都在REQ-ROUTER-ROUTER

为了简单起见,首先使用标准的,记录良好的方案启动和原型化任何软件 - 无论是REQ-REPXREQ-XREP== ROUTER-DEALER)还是其他任何记录的可扩展正式通信模式原型,在进入更复杂的多插槽和放大器之前多方复合阻塞和混合无阻塞高级消息传递&amp;信号场景,形成一些期望但非常先进的功能组合。

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

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;
}
相关问题