如何使用cppzmq从ROUTER套接字向特定的DEALER套接字发送ZeroMQ消息?

Vpaladino

为了将消息从路由器套接字发送到特定的DEALER Socker(设置了身份),我整理了这个最小的示例运行这两个程序时,它似乎挂在ROUTER上,等待来自DEALER的答复,而DEALER挂起,以等待ROUTER的请求因此,似乎ROUTER发送的消息永远不会传递给DEALER

路由器.cpp

#include <iostream>
#include <zmq.hpp>
#include <string>
#include <thread>
#include <chrono>

int main() {
    zmq::context_t context;
    zmq::socket_t socket (context, zmq::socket_type::router);
    // Enforce sending routable messages only
    socket.setsockopt(ZMQ_ROUTER_MANDATORY, 1);
    socket.bind("tcp://*:5555");

    try {
        std::string jobRequest = "ExampleJobRequest";

        std::cout << "Router: Sending msg: " << jobRequest << std::endl;

        // Set the address, then the empty delimiter and then the request itself
        socket.send("PEER2", ZMQ_SNDMORE);
        //socket.send(zmq::message_t(), ZMQ_SNDMORE);
        socket.send(zmq::str_buffer("ExampleJobRequest")) ;

        // Set the address, then the empty delimiter and then the request itself
        socket.send("PEER2", ZMQ_SNDMORE);
        //socket.send(zmq::message_t(), ZMQ_SNDMORE);
        socket.send(zmq::str_buffer("ExampleJobRequest")) ;

        // Receive the reply from the camera
        std::cout << "Router: Waiting for reply from camera " << std::endl;
        zmq::message_t reply;
        socket.recv(&reply);

        std::cout << "Router: Received " <<  std::string(static_cast<char*>(reply.data()), reply.size()) << std::endl;
    } catch (std::exception e) {
        std::cout << "Router Error: " << e.what();
    }

    std::this_thread::sleep_for(std::chrono::seconds(1));
    socket.close();
    context.close();
}

Dealer.cpp

#include <zmq.hpp>
#include <string>
#include <iostream>
#include <thread>

int main (void)
{
    //  Prepare our context and socket
    zmq::context_t context;
    zmq::socket_t socket (context, zmq::socket_type::dealer);

    std::cout << "Dealer: Connecting to RunJob server… \n";
    socket.setsockopt(ZMQ_IDENTITY, "PEER2", 5);
    socket.connect ("tcp://localhost:5555");

    while(true) {
        try {
            // Wait for next request from client
            std::cout << "Dealer: Waiting for request" << std::endl;
            zmq::message_t request;
            zmq::message_t empty;

            // Receive request
            socket.recv(&request);

            std::string requestString = std::string(static_cast<char*>(request.data()), request.size());

            std::cout << "Dealer: Received request" << std::endl;
            std::cout << requestString << std::endl;

            // ZMQ_SNDMORE - "Specifies that the message being sent is a multi-part message, and that further message parts are to follow"
            socket.send(zmq::str_buffer("Job completed"), zmq::send_flags::dontwait);
        }catch (std::exception e) {
            std::cout << "Router Error: " << e.what();
        }
    }

    // Used to set various 0MQ Socket Settings
    // ZMQ_Linger - Set linger period for socket shutdown
    socket.setsockopt(ZMQ_LINGER, 0);
    socket.close();
    context.close();

    return 0;
}

我本来以为我应该在消息前添加一个空的定界符socket.send(zmq::message_t(), ZMQ_SNDMORE);,但这会导致错误。同样使用以下内容也会导致在try / catch块中引发错误。该错误仅显示“未知错误”:

zmq::message_t delimiter(0);
socket.send(delimiter, ZMQ_SNDMORE);

使用以下命令创建分隔符也会导致相同的错误:

socket.send(zmq::message_t(), ZMQ_SNDMORE);

据我所知,当使用cppzmq时,您不需要添加空的定界符(对此我可能是错的,但是在阅读并查看了其他人的示例并测试了我自己的代码之后,这就是我所确定的)。

这是此设计的最终目标的非常基本的示意图:

路由器到经销商的消息传递设计

在我的研究中,我找不到该代码的一个很好的例子。Cppzmq github上具有非常小的文档和几个例子。

这是我看过的其他一些资料:

约翰·杰佛瑞斯(John Jefferies)

关于ROUTER / DEALER模式的主要思想是它是REPLY / REQUEST的异步概括。但是,您正在尝试反转模式中的套接字,发现它不合适,并扭曲代码以使其适合。不要那样做

您需要做的是“顺其自然”。在存在示例的简单方法中,经销商应发送第一条消息。然后,ROUTER对此做出响应。

经销商的下一个级别是在启动消息中标识自己。然后,ROUTER可以对该经销商给予特定的响应。

在下一个级别,您可以真正实现异步。ROUTER可以获取每个经销商的标识消息的副本,并使用该消息副本随时将异步消息发送给任何经销商。标识消息的一个副本将附加“ PEER2”框架并发送给经销商。这是可行的,因为消息的副本包括路由框架。理想情况下,您还将剥离“消息”框架,只在复制中保留路由框架。

警告-我不使用cppzmq,我使用CZMQ。我可以说使用CZMQ这种帧操作非常容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring Integration和TCP服务器套接字-如何向客户端发送消息?

来自分类Dev

ZeroMQ ROUTER套接字无法向REP套接字发送消息

来自分类Dev

将消息发送回特定的Web套接字

来自分类Dev

如何使用类ClientWebSocket通过Windows Phone 8上的Web套接字发送/接收消息?

来自分类Dev

Socket.io错误向套接字发送消息

来自分类Dev

如何使用ZeroMQ将字节数组发送到套接字?

来自分类Dev

Python:通过套接字发送的消息大小

来自分类Dev

使用python套接字发送消息

来自分类Dev

R中的ZeroMQ,如何关闭套接字

来自分类Dev

如何快速使用套接字(连接,发送和获取消息)

来自分类Dev

Python套接字-同时发送/接收消息

来自分类Dev

如何使用Phoenix向特定的套接字发送消息

来自分类Dev

无法通过套接字发送多条消息

来自分类Dev

如何在Web套接字连接中以无反应流的形式从订阅者向发布者发送消息

来自分类Dev

ZeroMQ:如何将Poller中使用的pollitem_t项目转换回ZeroMQ套接字?

来自分类Dev

如何使用ZeroMQ通过TCP套接字发送PNG图像?

来自分类Dev

如何使用ZeroMQ实现多个套接字?

来自分类Dev

接收特定的消息套接字编程C

来自分类Dev

Java套接字不发送/接收消息

来自分类Dev

读取服务器使用套接字发送的消息的变量

来自分类Dev

Python套接字发送消息无效的HTTP

来自分类Dev

使用Play Framework 2.3.6的Scala:向所有套接字客户端发送消息

来自分类Dev

如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

来自分类Dev

使用python套接字发送消息

来自分类Dev

如何使用python套接字在特定端口中发送消息?没有随机端口

来自分类Dev

通过套接字在python中发送消息

来自分类Dev

Java Android使用套接字发送消息

来自分类Dev

如何向通过套接字连接的特定客户端发送消息

来自分类Dev

如何实现向某些用户而不是所有套接字发送消息

Related 相关文章

  1. 1

    Spring Integration和TCP服务器套接字-如何向客户端发送消息?

  2. 2

    ZeroMQ ROUTER套接字无法向REP套接字发送消息

  3. 3

    将消息发送回特定的Web套接字

  4. 4

    如何使用类ClientWebSocket通过Windows Phone 8上的Web套接字发送/接收消息?

  5. 5

    Socket.io错误向套接字发送消息

  6. 6

    如何使用ZeroMQ将字节数组发送到套接字?

  7. 7

    Python:通过套接字发送的消息大小

  8. 8

    使用python套接字发送消息

  9. 9

    R中的ZeroMQ,如何关闭套接字

  10. 10

    如何快速使用套接字(连接,发送和获取消息)

  11. 11

    Python套接字-同时发送/接收消息

  12. 12

    如何使用Phoenix向特定的套接字发送消息

  13. 13

    无法通过套接字发送多条消息

  14. 14

    如何在Web套接字连接中以无反应流的形式从订阅者向发布者发送消息

  15. 15

    ZeroMQ:如何将Poller中使用的pollitem_t项目转换回ZeroMQ套接字?

  16. 16

    如何使用ZeroMQ通过TCP套接字发送PNG图像?

  17. 17

    如何使用ZeroMQ实现多个套接字?

  18. 18

    接收特定的消息套接字编程C

  19. 19

    Java套接字不发送/接收消息

  20. 20

    读取服务器使用套接字发送的消息的变量

  21. 21

    Python套接字发送消息无效的HTTP

  22. 22

    使用Play Framework 2.3.6的Scala:向所有套接字客户端发送消息

  23. 23

    如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

  24. 24

    使用python套接字发送消息

  25. 25

    如何使用python套接字在特定端口中发送消息?没有随机端口

  26. 26

    通过套接字在python中发送消息

  27. 27

    Java Android使用套接字发送消息

  28. 28

    如何向通过套接字连接的特定客户端发送消息

  29. 29

    如何实现向某些用户而不是所有套接字发送消息

热门标签

归档