您的位置:首页 > 运维架构 > Linux

关于Poll函数中的POLLHUP事件

2016-07-25 20:20 337 查看
下载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描述字不是一个打开的文件

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux Socket Poll