ZMQ PUSH PULL发送每条消息的一半

时间:2014-11-16 17:11:32

标签: c++ networking zeromq

我正在尝试发送一组图像,每个图像大约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的大小与预期的一样,但是,图像被“剪切” - 直到图像上的水平线(每个图像中的相同行) ),图像是正确的,之后它是完全黑色的。偶尔在黑色区域,会有一些噪音。

有没有人知道可能导致这种情况的原因?

1 个答案:

答案 0 :(得分:0)

这可能是什么原因造成的?错误的数据操作,而不是ZeroMQ

ZeroMQ发送功能(无论是两种风格,还是自我计算data.sizeOf())都可以移动透明& 字面上无论你通过什么传递它。

指示发送它的字节数(或少量字节)确实发送。

没有例外,没有任何借口。

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


如何证明?

修复您的数据 - " 框架" (在这种情况下数据 - "截止")或使用更安全模式的自动包装容器来独立于其变量大小调整来提供您的内容。

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

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

在那里你会注意到截止故障的来源 - 数据大小的错误计算。