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.
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
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
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