2016-05-23 40 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); 
相關問題