我需要将数据从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
类型的代表,但不知道如何使用它们以及它们是否打算供公众使用。
答案 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)