簡體   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