5

サブスクライブ パブリッシュ パターンを使用して、ac# zeromq クライアントが C++ サーバーからメッセージを受信するのに問題があります。

サーバーのセットアップは、2 種類のトランスポート戦略 (PublishSubsribe と RequestReply) を持つ 1 つのトランスポート層です。これらは c++ でコーディングされ、3.2.0 libzmq を使用します。

class PublishSubsribe : public ITransportStrategy
{
private:
     zmq::context_t _context;
     zmq::socket_t _socket;

public:

    PublishSubsribe(std::string url)
        :
    _context(1),
    _socket(_context, ZMQ_PUB)
    {
        std::cout << "Binding  " << url << std::endl;
        _socket.bind(url.c_str());
    }

    virtual void Wait()
    {
        boost::this_thread::sleep(boost::posix_time::milliseconds(100));
    }

    virtual void Send(zmq::message_t& message) 
    {
        _socket.send(outMessage) ;
    }
    ..
};  
class RequestReply : public ITransportStrategy
{
private:
     zmq::context_t _context;
     zmq::socket_t _socket;

public:

    RequestReply(std::string url)
        :
    _context(1),
    _socket(_context, ZMQ_REP)
    {
        _socket.bind(url.c_str());
    }

    virtual void Send(zmq::message_t& message) 
    {
        _socket.send(message);
    }

    virtual void Wait()
    {
        zmq_msg_t request;
        zmq_msg_init (&request);
        zmq_msg_recv (&request, _socket, 0);
        zmq_msg_close (&request);
    }
    ..
};

要求/応答パターンは、クライアントが c#/c++ の場合に機能します。エンコーディングの問題はないと思うようになりました...ただし、間違っている可能性があります。さらに、パブリッシャーからメッセージを受信する C++ のクライアント サブスクライバーがあります。

つまり、PubSub の私の c# クライアントは

//Bundled libzmq version: **3.2.2-rc2**  

        using (ZmqContext context = ZmqContext.Create())
        using (ZmqSocket client = context.CreateSocket(SocketType.SUB))
        {
            client.Connect("tcp://192.168.2.12:5555");

            client.SubscribeAll();
            while (true)
            {
                var msg = client.Receive(Encoding.UTF8);
                Console.WriteLine("Received Pub/Sub: yes");

            }
        }

はメッセージを受信して​​いません。ReqRep では UTF8 が機能しますが、すべてのエンコーディングを試しました。

4

1 に答える 1

2

C# と C++ プロジェクトで同じバージョンの libzmq を使用していないとおっしゃいましたが、それが問題なのでしょうか? 無意識のうちにlibzmq 2.xおよび3.xを使用したときに同じ問題が発生しました

また、サブスクライバーが接続した後にメッセージを公開することを保証する同期コードはありますか (ZMQ ガイドの「スロー ジョイナー シンドローム」を参照)。

于 2012-12-04T22:37:22.307 に答える