如何从 C# ZeroMQ 中的消息中提取数据?
How to extract data from message in C# ZeroMQ?
我需要将数据从 C++
发送到 C#
。
在 C++
方面,在 Linux 下,我正在使用 ZMQ
库 version 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);
我需要将数据从 C++
发送到 C#
。
在 C++
方面,在 Linux 下,我正在使用 ZMQ
库 version 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);