问题背景
两个不同镜像,记为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: