2016-05-23 89 views
0

我需要将数据从C++发送到C#如何从C#ZeroMQ中的消息中提取数据?

C++侧,在Linux下,我使用ZMQversion 4.1.4

C#旁边正在使用clrzmq4库基于4.1.5 version

那么,我在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); 

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

Question - 如何在这种情况下正确提取数据?通过硬编码提取我的代码中的偏移量非常难看,因为有一天zmq_msg_t可能会从发送端更改,并且数据将位于其他位置。其他选项是避免使用zmq_msg_t,当双方都不使用相同的平台/框架时。在clrzmq4框架中,我可以看到有zmq_msg_t类型的代表,但不确定如何使用它们以及它们是否用于公共用途。

+0

前15个字节是什么?如果它是一个头文件,那么它可能与这里编码的数据有偏移量。如果没有,您将别无选择,只能对偏移进行硬编码。 – Kevin

+0

在C++代码中,前8个字节是'int64_t file_desc',其他8个字节是'metadata_t * metadata'里面的struct。然后是数据。我希望有人了解clrzmq4库可能会提示如何处理它。或者也许推荐其他带有数据提取例程的.NET框架。 – Pablo

+0

请注意ZeroMQ中如何组装多部分消息。正如您在其他文章中所解释的那样,如果不是有意在低级别开发,请避免直接使用zmq_msg_t并使用更高级别的API接口。 – user3666197

回答

2

您在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); 
相关问题