【发布时间】:2017-03-13 23:41:35
【问题描述】:
我需要将数据从C++ 发送到C#。
在C++ 方面,在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 类型的委托,但不确定如何使用它们以及它们是否打算供公众使用。
【问题讨论】:
-
前 15 个字节是什么?如果它是一个标头,那么它可能具有在那里编码的数据的偏移量。如果没有,您将别无选择,只能硬编码偏移量。
-
查看 C++ 代码,前 8 个字节是
int64_t file_desc,其他 8 个字节是metadata_t *metadata在结构中。然后是数据。我希望了解 clrzmq4 库的人可以提示如何处理它。或者也许推荐其他具有数据提取例程的 .NET 框架。 -
在 ZeroMQ 中如何组装多部分消息时要小心。正如您在另一篇文章中所解释的,如果不是有意在低级别开发,请避免直接使用 zmq_msg_t 并使用更高级别的 API 接口。
-
也可能已经注意到 Steve Balousek 关于 更改 32B -> 64B
zmq_msg_t大小的提醒,自 4.1.x 版起,因此非同质交付应在高级别的操作服务,而不是字节缩放/对齐 详细信息 >>> stackoverflow.com/a/37107166/3666197