如何从 C# ZeroMQ 中的消息中提取数据?

How to extract data from message in C# ZeroMQ?

我需要将数据从 C++ 发送到 C#

C++ 方面,在 Linux 下,我正在使用 ZMQversion 4.1.4.

C# 方正在使用基于 4.1.5 version.

clrzmq4

所以我在 C++ 中发送消息的部分:

char tempStr[] = "ABCD";
zmq_msg_t zmsg;
zmq_msg_init_size(&zmsg, 4);
memcpy(zmq_msg_data(&zmsg), tempStr, 4);
int rc = zmq_send(reqSocket, &zmsg, sizeof(zmsg), 0);
zmq_msg_close(&zmsg);

C# 检索消息的代码:

ZFrame request = responder.ReceiveFrame();
byte[] reqBytes = new byte[100];
int n = request.Read(reqBytes, 0, 100);

问题是字节数​​组包括 zmq_msg_t 的所有 64 个字节。实际数据是从偏移量 16 开始的。

Question - 在这种情况下如何正确提取数据?通过硬编码提取我的代码中的偏移量简直是丑陋的,因为有一天 zmq_msg_t 可能会从发送方更改并且数据将位于其他地方。另一种选择是在双方不使用相同的 platform/framework 时避免使用 zmq_msg_t。在 clrzmq4 框架中,我可以看到有 zmq_msg_t 类型的委托,但不确定如何使用它们以及它们是否打算用于 public 用法。

您在 C++ 端混合发送类型,如果使用 zmq_msg_t 您不需要具有大小的变体,那就是发送缓冲区。

如果使用缓冲功能

int zmq_send (void *socket, void *buf, size_t len, int flags)

那你应该做

zmq_send(reqSocket, tempStr, 4, 0);

但是如果使用 zmq_msg_t 变体

int zmq_msg_send (zmq_msg_t *msg, void *socket, int flags)

那么你应该这样做:

zmq_msg_send (&zmsg, reqSocket, 0);