2016-05-23 18 views
0

C++からC#にデータを送信する必要があります。 C++C#ZeroMQでメッセージからデータを抽出するには?

は、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が送信側から変更され、データが別の場所に配置される可能性があるため、自分のコードでオフセットをハードコーディングして抽出するのは簡単ではありません。他のオプションは、両側が同じプラットフォーム/フレームワークを使用していない場合にzmq_msg_tを使用しないことです。 clrzmq4フレームワークでは、zmq_msg_tタイプの代理人がいますが、その使用方法や一般使用を意図しているかどうかはわかりません。

+0

最初の15バイトは何ですか?ヘッダの場合は、そこにエンコードされたデータへのオフセットがあるかもしれません。そうでない場合は、オフセットをハードコードする以外に選択肢はありません。 – Kevin

+0

C++コードで見ると、最初の8バイトは 'int64_t file_desc'で、他の8バイトはstructの中の' metadata_t * metadata'です。次にデータが来る。私はclrzmq4ライブラリの知識を持っている人がそれをどのように扱うかをヒントにしてくれることを期待していました。あるいは、データ抽出ルーチンを持つ他の.NETフレームワークをお勧めします。 – Pablo

+0

マルチパートメッセージがZeroMQでどのようにアセンブルされているかを気を付けてください。他の記事で説明したように、低レベルで意図的に開発しない場合は、zmq_msg_tを直接使用して、より高レベルのAPIインターフェイスを使用しないでください。 – user3666197

答えて

2

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); 
関連する問題