一开始使用jeroMQ,由于java会自动回收资源,所以socket对象及context对象的清理比较简单。断开连接和关闭连接不需要考虑连接的状态。所以程序比较简单。
但在C/C++环境下,zmq连接的处理需要考虑如下情况:
(1)在zmq_recv()的阻塞状态下,不可能断开连接。
(2)在连接没有断开和关闭的情况下,context不能关闭(呈阻塞状态)。
(3)在上面两种情况下,可能会有内存泄漏的问题。
为了解决以上问题,在C/C++环境下,必须:
(1)如果没有把握保证zmq_recv()一定能够接收到消息,则必须设置其ZMQ_RCVTIMEO值,使其在接不到消息时可以退出阻塞,以判断是否程序需要退出。
int recvTime = 500; zmq_setsockopt(_socket, ZMQ_RCVTIMEO, &recvTime, sizeof(recvTime));
ret1 = zmq_recv(_zsocket, sub, 128, 0); //接收消息 if(ret1 == -1) { int error = zmq_errno(); cout << "ERROR: messageReceiver socket: wrong message --" << zmq_strerror(error) << endl; if(getSimEnd()) { //closedeliver(); //stop deliver closeCallbackLink(); //stop the callback link cout << "messageReceiver thread closed......2" << endl; return; } }
void MessageReceiver::closeCallbackLink() { //QMutexLocker locker(&_mutex); if(_zsocket == nullptr) return; //setSimEnd(); //Sleep(500); if(_type == tcp) { char abuf[128]; memset(abuf, '