zeromq / cppzmq

Header-only C++ binding for libzmq
http://www.zeromq.org
MIT License
1.95k stars 757 forks source link

epgm subscriber cannot receive message #615

Open pengfengyong opened 1 year ago

pengfengyong commented 1 year ago

I hava choosed --with-pgm this code can only send message,but cannot receive message

import zmq

# 创建上下文
context_p = zmq.Context()
context_s = zmq.Context()

# 创建发布者
publisher = context_p.socket(zmq.PUB)
publisher.bind("epgm://192.168.0.40;224.0.0.1:5555")  # 使用您的本机网络接口和组播地址

# 创建订阅者
subscriber = context_s.socket(zmq.SUB)
subscriber.connect("epgm://192.168.0.40;224.0.0.1:5555")  # 使用相同的组播地址

# 订阅所有消息
subscriber.setsockopt_string(zmq.SUBSCRIBE, "")

try:
    while True:
        # 发布消息
        message = input("请输入要发布的消息:")
        publisher.send_string(message)

        # 接收并处理消息
        received_message = subscriber.recv_string()
        print(f"接收到消息: {received_message}")

except KeyboardInterrupt:
    pass

# 关闭套接字和上下文
publisher.close()
subscriber.close()
context_p.term()
context_s.term()

in C++,I meet the same problem. publisher.cpp

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

int main() {
    // 创建 ZeroMQ 上下文
    zmq::context_t context(1);

    // 创建 PGM 套接字,使用 PGM 协议
    zmq::socket_t socket(context, zmq::socket_type::pub);
    socket.setsockopt(ZMQ_SNDHWM, 0);  // 设置发送高水位标记,不限制发送队列大小

    // 使用 pgm:// 协议绑定到组播地址和端口
   // i hava tried socket.bind("epgm://eth0;239.255.0.1:5555");
    socket.bind("epgm://192.168.0.40;239.255.0.1:5555");

    std::string message = "Hello, multicast!";

    while (true) {
        // 发送消息到组播地址
        zmq::message_t zmqMessage(message.size());
        memcpy(zmqMessage.data(), message.data(), message.size());
        socket.send(zmqMessage);

        std::cout << "Sent: " << message << std::endl;

        // 休眠一段时间
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}

subscriber.cpp

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

int main() {
    // 创建 ZeroMQ 上下文
    zmq::context_t context(1);

    // 创建 PGM 套接字,使用 PGM 协议
    zmq::socket_t socket(context, zmq::socket_type::sub);

    // 使用 pgm:// 协议连接到组播地址和端口
   // i hava tried socket.connect("epgm://eth0;239.255.0.1:5555");
    socket.connect("epgm://192.168.0.40;239.255.0.1:5555");

    // 订阅所有消息
    socket.setsockopt(ZMQ_SUBSCRIBE, "", 0);

    while (true) {
        zmq::message_t zmqMessage;
        socket.recv(&zmqMessage);

        std::string message(static_cast<char*>(zmqMessage.data()), zmqMessage.size());
        std::cout << "Received: " << message << std::endl;
    }

    return 0;
}
Hsyy04 commented 6 months ago

I meet the same problem. May I ask how you solved it?

myk502 commented 1 month ago

epgm protocol is not supported when subscriber and publisher is on the same machine. Try to use ipc for that case.