サブスクライブ パブリッシュ パターンを使用して、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 が機能しますが、すべてのエンコーディングを試しました。