2016-05-23 13 views
0

Ich muss Daten von C++ zu C# senden.So extrahieren Sie Daten aus der Nachricht in C# ZeroMQ?

Auf C++ Seite unter Linux, ich bin mit ZMQ Bibliothek version 4.1.4.

C# Seite verwendet clrzmq4 Bibliothek basierend auf 4.1.5 version.

also der Teil, wo I Nachricht in C++ senden:

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# Code Nachricht abzurufen:

ZFrame request = responder.ReceiveFrame(); 
byte[] reqBytes = new byte[100]; 
int n = request.Read(reqBytes, 0, 100); 

Das Problem ist, dass Byte-Array wird mit allen 64 Byte zmq_msg_t. Die tatsächlichen Daten beginnen bei Offset 16.

Question - wie in diesem Fall Daten richtig extrahieren? Extrahieren durch harte Codierung der Offset in meinem Code ist einfach hässlich, weil eines Tages zmq_msg_t von der Senderseite geändert werden kann und Daten woanders liegen. Eine andere Möglichkeit besteht darin, die Verwendung von zmq_msg_t zu vermeiden, wenn beide Seiten nicht dieselbe Plattform/dasselbe Framework verwenden. In der clrzmq4 Rahmen kann ich sehen, es gibt Delegierte für zmq_msg_t Arten, aber nicht sicher, wie man sie verwendet und ob sie für die Öffentlichkeit bestimmt sind.

+0

Was ist in den ersten 15 Bytes? Wenn es eine Kopfzeile ist, hat sie vielleicht den Offset zu Daten, die dort codiert sind. Wenn nicht, haben Sie keine andere Wahl, als den Offset hart zu programmieren. – Kevin

+0

In C++ - Code, erste 8 Byte ist 'int64_t file_desc' und andere 8 Byte ist' metadata_t * metadata' in struct. Dann kommen Daten. Ich hatte gehofft, dass jemand mit Kenntnis der clrzmq4-Bibliothek einen Hinweis geben könnte, wie man damit umgeht. Oder vielleicht ein anderes .NET-Framework mit Datenextraktionsroutinen. – Pablo

+0

Achten Sie darauf, wie mehrteilige Nachrichten in ZeroMQ zusammengestellt werden. Wie in Ihrem anderen Beitrag erläutert, sollten Sie vermeiden, zmq_msg_t direkt zu verwenden und die API-Schnittstelle auf höherer Ebene zu verwenden, wenn Sie nicht absichtlich auf niedriger Ebene entwickeln. – user3666197

Antwort

2

Sie mischen die Sendetypen auf der C++ Seite, wenn Sie zmq_msg_t verwenden, brauchen Sie die Variante mit einer Größe, die für das Senden eines Puffers ist.

Bei Verwendung der Pufferfunktion

int zmq_send (void *socket, void *buf, size_t len, int flags) 

Dann sollten Sie

zmq_send(reqSocket, tempStr, 4, 0); 

jedoch tun, wenn mit zmq_msg_t Variante

int zmq_msg_send (zmq_msg_t *msg, void *socket, int flags) 

Dann sollten Sie tun:

zmq_msg_send (&zmsg, reqSocket, 0); 
Verwandte Themen