【问题标题】:cppzmq fails to receive tcp messagescppzmq 无法接收 tcp 消息
【发布时间】:2022-06-17 20:50:49
【问题描述】:

我正在尝试在我的 Ubuntu 机器上使用 ZMQ 套接字与 ESP8266 边缘设备进行通信。我尝试了这段运行良好的 Python 代码:

import zmq

ctx = zmq.Context()

router = ctx.socket(zmq.ROUTER)
router.router_raw = True

router.bind("tcp://*:8081")

while True:
    msg = router.recv_multipart()
    identity, body = msg

    print(identity)
    print(body)

因为它提供(服务器端)

b'\x00k\x8bEg'
b''
b'\x00k\x8bEg'
b'hello from ESP8266'
b'\x00k\x8bEg'
b'\r\n'

但是当我把它翻译成 C++ 时


#include <zmq_addon.hpp>

int main () {
    zmq::context_t context;
    zmq::socket_t socket(context, zmq::socket_type::router);
    int router_raw = 1;
    zmq_setsockopt(&socket, ZMQ_ROUTER_RAW, &router_raw, 1);
    socket.bind("tcp://*:8081");

    while (true) {
        std::cout << "listening " << std::endl;
        std::vector<zmq::message_t> msgs;

         if (zmq::recv_multipart(socket, std::back_inserter(msgs))) {
            std::cout << "got " << static_cast<const char *> (msgs.front().data())
                << std::endl;
         }
    }
    return 0;
}

它不再工作并在recv_multipart 之前挂起,但同时ESP8266 客户端确实收到了一些奇怪的 符号,我猜它表示tcp 连接成功。

【问题讨论】:

    标签: c++ websocket zeromq pyzmq


    【解决方案1】:

    客户端收到的奇怪符号是 ZMQ 的内部协议,ZMQ_ROUTER_RAW 通常会抑制它,只是你调用设置 ZMQ_ROUTER_RAW 是错误的。 zmq_setsockopt 的最后一个参数应该是您传递的新选项值的大小(以字节为单位)。它应该是sizeof(router_raw) 而不是1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      相关资源
      最近更新 更多