ZMQ等待消息,让客户端等待回复

时间:2015-03-02 15:40:24

标签: c++ networking zeromq

我正在尝试将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: 我用一个可编译的例子和linux makefile创建了一个github repo并转换为再次使用REP REQ。问题是客户端不接受来自服务器的消息,但同样,我不知道为什么。

1 个答案:

答案 0 :(得分:-1)

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

我会留下github repo,因为我认为这个问题已经足够长了。