epgm在不同镜像的容器中,无法同时绑定地址的问题

在Docker容器中,不同镜像的进程尝试绑定同一epgm组播地址时遇到问题。经过分析,发现是由于不同镜像的内核版本和SO_REUSEADDR/SO_REUSEPORT设置导致。通过设置SO_REUSEADDR或SO_REUSEPORT,使得不同容器能在同一端口进行组播绑定。
摘要由CSDN通过智能技术生成

问题背景

两个不同镜像,记为A,B镜像,A镜像生成两个的容器A1,A2,B镜像生成B1,B2。使用zmq组件的,epgm方式进行通信,需要先进行地址绑定。表示该服务加入某个组播地址,订阅该组播的消息。

问题表现:

1、直接在A1,A2同时跑这段代码,没有问题。都能成功绑定组播地址。

2、直接在B1,B2同时跑这段代码,也是没有问题,都能成功绑定组播地址。

3、直接在A1上运行这段代码,同时也在B1上运行,后启动的会报错退出,对应的错误是端口绑定失败,被占用。errno为98,表示地址被占用。

问题初步分析


直接先上一段代码

#include <zmq.hpp>
#include <iostream>
#include <sstream>
#include <exception>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
usingnamespace std;
intmain (intargc, char*argv[])
{
    try{
        zmq::context_t context (1);
        zmq::socket_t subscriber (context, ZMQ_SUB);
        intrate = 10000;
        subscriber.setsockopt(ZMQ_RATE, &rate, sizeof(rate));
        subscriber.setsockopt(ZMQ_SUBSCRIBE,"", 0);
        inthwm = 0;
        subscriber.setsockopt(ZMQ_RCVHWM, &hwm, sizeof(hwm));
        //这里表示加入组播,订阅该组播的消息
        subscriber.connect("epgm://127.0.0.1;239.192.1.1:5555");
        intupdate_nbr;
        for(;;){
            zmq::message_t update;
            cout << "before recv" << endl;
            subscriber.recv(&update);
            cout << "recv data = " << (char*)update.data() << endl;
            cout << "data size = " << update.size() << endl;
            std::cout << std::endl << std::endl;;
        }
    }catch(exception& e) {
        cerr << "exception occur:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值