如何使用 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# 端,假设你已经成功连接并传输了消息,但服务器没有反映任何变化(就像你没有收到呼叫一样)。
可能是什么原因?
【问题讨论】:
inNetMq
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 单一应用程序