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

时间:2016-05-23 18:25:32

标签: c# zeromq

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

C++方面,在Linux下,我使用 ZMQ version 4.1.4

C#方正在使用基于4.1.5 version的{​​{3}}库。

所以我在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可能会从发送方改变,而数据将位于其他地方。其他选项是避免使用zmq_msg_t,当双方都没有使用相同的平台/框架时。在clrzmq4框架中,我可以看到zmq_msg_t类型的代表,但不知道如何使用它们以及它们是否打算供公众使用。

1 个答案:

答案 0 :(得分:2)

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

如果使用缓冲功能

In [11]: clf.predict(pd.concat([close_buy1, m5, m10, ma20], axis=1))
Out[11]:
array([[  7.87401353e+02,   7.93261381e+02,   7.87071324e+02, ...,
          5.48000000e+06,   3.96049623e+02,   0.00000000e+00],
       [  7.95991368e+02,   8.07001373e+02,   7.95281379e+02, ...,
          5.88550000e+06,   4.03022676e+02,   0.00000000e+00],
       [  8.05301357e+02,   8.08971379e+02,   7.91791350e+02, ...,
          5.54900000e+06,   3.95834832e+02,   1.00000000e+00],
       ...,
       [  7.15989990e+02,   7.21520020e+02,   7.04109985e+02, ...,
          1.99950000e+06,   7.06229980e+02,   1.00000000e+00],
       [  7.03669983e+02,   7.11599976e+02,   7.00630005e+02, ...,
          1.76340000e+06,   7.06630005e+02,   0.00000000e+00],
       [  7.02359985e+02,   7.06000000e+02,   6.96799988e+02, ...,
          1.65630000e+06,   7.00320007e+02,   1.00000000e+00]])

然后你应该做

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)