【问题标题】:ZeroMQ C++ client is not receivingZeroMQ C++ 客户端未接收
【发布时间】:2016-05-22 16:05:15
【问题描述】:

我最近使用Pupil 眼球追踪器开始了一个新项目。要将跟踪信息广播给他们使用ZeroMQ 的其他客户。我已经通过尝试他们简单的 Python 客户端示例验证了他们的服务器正在正确运行:

import zmq
import json

#network setup
port = "5000"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:"+port)

# recv all messages
socket.setsockopt(zmq.SUBSCRIBE, '')

while True:
    topic =  socket.recv_multipart()
    #msg = json.loads(topic)
    print  "\n\n",topic[0] #,":\n",msg

由于我的项目应该是 C++,因此我尝试使用以下 ZeroMQ 示例将其翻译成 C++:

#include "zmq.hpp"
#include <string>
#include <iostream>

int main()
{
    //  Prepare our context and socket
    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_SUB);

    std::cout << "Connecting to hello world server" << std::endl;
    socket.connect("tcp://127.0.0.1:5000");

    socket.setsockopt(ZMQ_SUBSCRIBE, "");

    //  Do 100 requests, waiting each time for a response
    for (int request_nbr = 0; request_nbr != 100; request_nbr++) {

        //  Get the message.
        zmq::message_t msg;
        socket.recv(&msg);
        std::cout << "Received World " << msg.data() << std::endl;
    }
    return 0;
}

不幸的是,这不起作用,C++ 客户端只是挂在 socket.recv(&msg);等待它从未收到的消息。

对于这个项目,我使用的是 Visual Studio 2013 和 ZeroMQ 库 libzmq-v120-mt-4_0_4.lib,它是 ZeroMQ 安装附带的(我没有编译它)。为了设置它,我使用了this 教程,而不是整个粘贴,因为我觉得它有点无关紧要。

我认为我使用的配置是 x64 而 Pupil 是 32 位,但如果我没记错的话,这应该与 ZeroMQ 无关。

Pupil 使用 pyzmq,它应该与 4.04 zmq lib 兼容。

【问题讨论】:

  • 您可能想检查 Pupil 的 pyzmq 真的 是否使用 zmq 4.0.4。我个人之前也遇到过不同版本之间的兼容性问题(甚至崩溃),所以我建议你验证一下实际使用的版本。
  • Pupil 推荐 pyzmq‑14.7.0,它应该支持 4.1.x zmq。这是我能找到的信息。我可以看到他们的 libzmq.pyd 文件,但我认为我无法检查版本。值得一提的是,运行的 Python 客户端实际上使用了最新的 pyzmq,pyzmq-15.2.0-cp27
  • 可以查看this等版本
  • 谢谢。我为 Python 安装的 ZMQ 版本是 4.1.2。我已经设法下载并编译了最新的 Libzmq master 分支,但这并没有解决我的问题。
  • 嗯。如果您在两端运行完全相同的 zmq 版本时遇到相同的问题,那么我不确定发生了什么。就我个人而言,我会开始尝试一些不同的端口,检查netstat,尝试通过 telnet/PuTTY 手动连接等以获取更多信息。

标签: c++ visual-studio-2013 zeromq


【解决方案1】:

由于某种原因,我仍然不知道,包装器 zmq.hpp 在我的情况下不起作用。使用来自book 的解决方案,它不使用这个助手解决我的问题

int main(int argc, char *argv[])
{
    void *context = zmq_ctx_new();

    //  Socket to talk to server
    void *subscriber = zmq_socket(context, ZMQ_SUB);
    int rc = zmq_connect(subscriber, "tcp://127.0.0.1:5000");
    assert(rc == 0);

    rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", strlen(""));
    assert(rc == 0);

    //  Process 100 updates
    int update_nbr;
    long total_temp = 0;
    for (update_nbr = 0; update_nbr < 100; update_nbr++) {
        char msg[256];
        rc = zmq_recv(subscriber, msg, 256, 0);
        std::cout << "Received World " << msg << std::endl;
    }

    zmq_close(subscriber);
    zmq_ctx_destroy(context);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2020-02-05
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多