0

次の制御フローがあります。for ループで、文字列の配列を作成します。配列 (文字列) の各行をパブリッシャー関数に送信します。パブリッシャー関数は、文字列を送信することになっています。パブリッシャーが無限ループでパブリッシュしている場合、サブスクライバーがメッセージしか受信しないという問題があります。パブリッシャー関数を継続的に呼び出してデータを送信させることができないのはなぜですか? 無限ループでしか機能しないのはなぜですか?

ここに私のパブリッシャー機能があります:

    int zedMQserver(std::string output)
     {

     //std ::cout << output.c_str()<< std:: endl;




zmq::context_t context (1);
zmq::socket_t publisher (context, ZMQ_PUB);
publisher.bind("tcp://*:5556");
publisher.bind("ipc://device.ipc");                // Not usable on Windows.


    int i=1;   
    //while(1) {




    //  Send message to all subscribers

  const int SIZE = output.length();

    zmq::message_t message(SIZE+1);
    snprintf ((char *) message.data(), (SIZE+1) ,
        "%s", output.c_str());
    publisher.send(message);
   std :: cout << "sent message" << std:: endl;
//}
return 0;

ここに私のサブスクライバー関数があります:

#include <zmq.hpp>
#include <iostream>
#include <sstream>



int main (int argc, char *argv[])


  {

 zmq::context_t context (1);

 //Socket to talk to server
 std::cout << "Collecting updates from device server...\n" << std::endl;
 zmq::socket_t subscriber (context, ZMQ_SUB);
 subscriber.connect("tcp://localhost:5556");
 const char *filter = (argc > 1)? argv [1]: "";  // no filter currently
 subscriber.setsockopt(ZMQ_SUBSCRIBE, filter, strlen (filter));
 //  Process 100 updates
 zmq::message_t update;

 for (int q =0 ; q<1000 ; q++) {
    subscriber.recv(&update);

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


    std:: cout <<output << std:: endl;       
    }  
 return 0;







  }

while(1) ステートメントを削除すると、何も受信されないのはなぜですか?

4

1 に答える 1

0

したがって、これは典型的な「遅いジョイナーの問題」であることがわかります。パブリッシャーを少しスリープさせたところ、うまくいきました。

于 2016-09-21T16:56:03.470 に答える