【问题标题】:How to extract data from message in C# ZeroMQ?如何从 C# ZeroMQ 中的消息中提取数据?
【发布时间】:2017-03-13 23:41:35
【问题描述】:

我需要将数据从C++ 发送到C#

C++ 方面,在Linux 下,我使用ZMQversion 4.1.4

C# 方正在使用基于4.1.5 versionclrzmq4 库。

所以我在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

标签: c# zeromq


【解决方案1】:

您在 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);

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 2012-06-09
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多