最近项目中使用ZMQ相关的库作为通讯组件,前期用得还算是比较顺利,API使用很简单而且易上手。用了是稳定的4.1.2版本C++版本。
近期忽然发现,一个服务,使用多路复用zmq::poll无法收到包。问题表现:
1)自己的机器上能正常使用poll收到包,没有问题。(自己的机器使用docker镜像环境在跑,代码在git上拉下来)
2)同事的机器上的相同的代码下,无法收到poll包。(同事的机器,直接跑)
比对之后,怀疑是使用ZMQ版本问题,于是在同事机器上也搭好了docker环境,再试,还是一样的结果。
于是开始进行排查问题。
排查过程(一系列莫名其妙的问题)
A)进行抓包分析,发现ZMQ的发送端没有把数据包发出来,奇怪的是,改了接收端逻辑,不使用多路复用,使用阻塞式收包方式,居然能收到包。
疑问:包发不出来,应该跟发送相关,跟接收是啥关系?
B)GDB单步调试,发送的时候,发送端的状态总是返回非法,在最深处,发现是在一个getsockopt中返回一个EAGAIN错误。一脸茫然。
C)加了monitor到里面去查看连接状态,只看到状态不正确,但定位不到具体原因。
D)另外,再在出问题的机器上,使用之前写好的单独进程的DEMO代码进行测试,看能否使用IO