【问题标题】:ZMQ PUSH PULL half of each message sentZMQ PUSH PULL 每条消息发送一半
【发布时间】:2014-11-17 09:01:05
【问题描述】:

我正在尝试发送图像流,每个图像大约 3.5Mb。要发送,我使用以下格式的代码:

zmq::socket_t sender (*context, ZMQ_PUSH);
sender.connect("tcp://....:5556");
while(...){
    zmq::message_t msg (data, (size_t)camHeight*camWidth, NULL,NULL);
    sender.send(msg, ZMQ_NOBLOCK);
}

并接收:

zmq::socket_t socket(zmqContext, ZMQ_PULL);
socket.bind("tcp://*:5556");
zmq::message_t msg;

while(..){
    socket.recv(&msg);
    unsigned char* data = (unsigned char*) msg.data();
    ...
    outFile.write ((char*) data, msg.size());
}

我希望通过的所有图像都通过并且 msg 的大小与预期的一样,但是,图像被“剪裁” - 直到图像上的一条水平线(每张图像中的同一条线),图像是正确的,之后它是完全黑色的。偶尔在黑色部分,有一些杂音。

有人知道是什么原因造成的吗?

【问题讨论】:

  • 如果您的图像数据大小仅为camHeight*camWidth(以字节为单位),我会感到非常惊讶;我怀疑您的图像是每个像素一个字节。根据您的观察,您只发送了图像的一部分,因为您的消息大小太小,而图像的剩余部分只是未初始化的内存(通常是黑色 0,但有时是随机的非零数据)。
  • 是的,我忘记了 3 个频道,谢谢!

标签: c++ networking zeromq


【解决方案1】:

什么可能导致这种情况?错误的数据操作,而不是 ZeroMQ

ZeroMQ 发送函数(在这两种风格中,无论是否自行计算 data.sizeOf()透明地 & 从字面上看,无论您传递它发送什么。

按照指示发送的字节数(或字节数)发送。

没有例外,没有借口。

因此,如果您指示 ZeroMQ 仅发送原始文件的一小部分,那么您就可以了。你得到的只是你指出的那一小部分(无论是有意还是错误)。


如何证明?

修复您的数据-“框架”(在本例中为 data-“cut-off”)或使用更安全模式的自包装容器来交付您的内容,而不受其可变大小的影响。

如果有疑问,只需尝试将您的图像数据放入 JSON 甚至更易于阅读的案例中,将其存储在 ZIP 文件中以进行此类测试。

然后,将其移动到 ZeroMQ 消息层,并尝试从 JSON/ZIP 文件中重建数据。

在那里你会注意到截止失败的根源——数据大小的错误计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多