【问题标题】:ZMQ wait for a message, have client wait for replyZMQ 等待消息,让客户端等待回复
【发布时间】:2015-03-03 07:48:20
【问题描述】:

我正在尝试将 4 个客户端同步到一台服务器。当客户端准备好继续前进时,我想向服务器发送一条消息,然后服务器计算它收到多少请求,然后向客户端发送一条消息,表示它已准备好。

到目前为止我所做的是使用 REQ/REP:

while(1){
    int responses = 0;
    while(responses<numberOfCameras){
        for(int i=0; i<numberOfCameras;i++){
          cout<<"waiting"<<endl;
          if(sockets[i]->recv(requests[i], ZMQ_NOBLOCK)){
            responses ++;
            cout<<"rx"<<endl;
          }
        }
    }
    for(int i=0; i<numberOfCameras;i++){
      cout<<"tx"<<endl;
      sockets[i]->send("k",1);
      cout<<"Sent"<<endl;
    }
}

如果有多个摄像头,这会产生预期的错误:

Operation cannot be accomplished in current state

因为它在回复 REQ 之前什么都做不了,对吧?

如何修改它以与多个客户端一起使用?

编辑: 我试图用 PUSH PULL 来实现一个不太严格的 REQ REP。肉是:

服务器:

while(1){
    int responses = 0;
    while(responses<numberOfCameras){
        for(int i=0; i<numberOfCameras;i++){
          cout<<"waiting"<<endl;
          if(REQSockets[i]->recv(requests[i], ZMQ_NOBLOCK)){
            responses ++;
            cout<<"rx"<<endl;
          }
        }
    }
    boost::this_thread::sleep(boost::posix_time::milliseconds(200));

    for(int i=0; i<numberOfCameras;i++){
      cout<<"tx"<<endl;
      REPSockets[i]->send("k",1);
      cout<<"Sent"<<endl;
    }
    boost::this_thread::sleep(boost::posix_time::milliseconds(200));
}

客户:

for (;;) {
    std::cout << "Requesting permission to capture"<< std::endl;
    REQSocket.send ("?", 1);

    //  Get the reply.
    zmq::message_t reply;
    REPSocket.recv (&reply);
    std::cout << "Grabbed a frame" << std::endl;
    boost::this_thread::sleep(boost::posix_time::seconds(2));
}

我已输出所有端口和地址以检查它们是否设置正确。

服务器程序挂起并输出:

... 
waiting
rx 
tx

这意味着程序挂在发送上,但我一生都看不到为什么

编辑 2: 我已经制作了一个 github repo,其中包含一个可编译的示例和 linux makefile,并再次转换为使用 REP REQ。问题是客户端不接受来自服务器的消息,但同样,我不知道为什么。

【问题讨论】:

    标签: c++ networking zeromq


    【解决方案1】:

    答案是在编辑 2 中使用两个 REP REQ 套接字。我在其中一个变量用法中为“REQ”而不是“REP”做了一个愚蠢的错字,但没有注意到。因此,我连接然后绑定同一个套接字。

    我将保留 github 存储库,因为我认为这个问题已经足够长了。

    【讨论】:

    • 很高兴你明白了 :) 请将你的答案标记为已接受,以便社区的其他人知道你的问题已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2012-11-10
    • 2016-06-25
    • 2020-07-02
    相关资源
    最近更新 更多