如何使用 ZeroMQ 从 C# 客户端向 C++ 服务器发送消息

Posted

技术标签:

【中文标题】如何使用 ZeroMQ 从 C# 客户端向 C++ 服务器发送消息【英文标题】:How to send a message from C# client to C++ server using ZeroMQ 【发布时间】:2020-07-09 22:35:08 【问题描述】:

我正在制作一个在三个不同部分中工作的应用程序。一台运行 C++ 的服务器和两台运行 C# 和 Python 的客户端。 客户端连接到服务器并发送消息。

为此,我选择了 ZeroMQ。

因为这是一个POC,所以代码很简单。

服务器代码 (C++) (cppzmq)

zmq::context_t context 1 ;
zmq::socket_t socket context, zmq::socket_type::rep ;
socket.bind("tcp://*:5555");
zmq::message_t request;
socket.recv(request, zmq::recv_flags::none);

Python 客户端 (pyzm)

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
socket.send(b"Hello")

C# 客户端 (NetMQ)

using(var socket =  new RequestSocket())

    socket.Connect("tcp://localhost:5555");
    byte[] msg = Encoding.ASCII.GetBytes("HEllo");
    socket.SendFrame(msg);
 

Python客户端与服务端连接成功,服务端收到客户端发送的消息。 但是C#客户端和服务器的连接不正确。在 C# 端,假设你已经成功连接并传输了消息,但服务器没有反映任何变化(就像你没有收到呼叫一样)。

可能是什么原因?

【问题讨论】:

in NetMq socket.SendFrame 似乎支持字符串类型。搏一搏。 socket.SendFrame("HEllo")。参考:zeromq.org/get-started/?language=csharp&library=netmq# 如果连续运行多次Python版本,然后连续运行C#版本,行为是否相同?处理 C++ 代码中的连续消息可能是个问题,而不是 C# 代码特有的任何问题。 @cdhowie,因为我正在测试软件,所以我没有连续运行。我的意思是我启动服务器并启动两个客户端之一,我从客户端发送消息并检查服务器是否收到它。 @Supun De Silva,我试过了,还是不行。 @LuisSerra 您可以考虑使用Wireshark 来查看通过(虚拟环回)线路实际发送的内容。这可能会帮助您缩小问题的确切范围。 【参考方案1】:

对于 c#,我使用了 NetMQMessage。这对您更有效吗?我使用其他选项(没有逗留和超时)

using (var client = new RequestSocket()) 
  
   client.Connect("tcp://192.168.1.216:8000");

   NetMQMessage msg = new NetMQMessage();
   msg.Append("my request string buffer", Encoding.UTF8);
   client.SendFrame(msg.ToString());

   var res_bytes = client.ReceiveFrameBytes();
   // add some function to transform bytes to string


【讨论】:

以上是关于如何使用 ZeroMQ 从 C# 客户端向 C++ 服务器发送消息的主要内容,如果未能解决你的问题,请参考以下文章

具有 REQ 和 REP 套接字的 C++ ZeroMQ 单一应用程序

如何使用 DLLImport 将字符串从 C# 传递到 C++(以及从 C++ 到 C#)?

通过 COM 为 C++ 客户端公开 C#

ZeroMQ:如何实现客户端通知?

zeromq:如何防止无限等待?

ZeroMQ:Python 服务器到 C++ 客户端