下载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 | 描述字不是一个打开的文件 |