关于Poll函数中的POLLHUP事件

下载mosquitto的源码后,分别在本地搭起server和client来测试,发现client在disconnect的时候,server经常收到"Socket error on client XXXX disconnecting.",仔细看代码,发现原来代码中有这么一段:

if(pollfds[context->pollfd_index].revents & (POLLERR | POLLNVAL | POLLHUP)){
do_disconnect(db, context);
continue;
}

原因是client在发送完disconnect命令后自行把socket进行关闭了;此时server可能还没有接收处理到disconnect消息,但是POLLUP事件先行发现了client的socket已经关闭,所以才有了这一段代码的处理。

poll函数的事件标志符值

常量 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 对方描述符挂起
POLLNVAL 描述字不是一个打开的文件


你可能感兴趣的:(Mosquitto)