繁体   English   中英

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

[英]ZMQ wait for a message, have client wait for reply

我正在尝试将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存储 ,并再次转换为使用REP REQ。 问题是客户端不接受来自服务器的消息,但是同样,我也不知道为什么。

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

我将离开github存储库,因为我认为问题已经足够长了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM