"select一直返回0"的问题解决和总结

场景:一个简单的TCP 服务器,以实现UPNP的事件体系结构

我在linux平台下,建立一个TCP套接字,绑定到49156端口,向UPNP SERVER发一个subscribe订阅请求,超时时间设置为5minutes.linux

而后开启一个Thread_Main主接收线程。该线程完成如下工做:服务器

(1)调用select监听是否有数据可读,设置4s的超时;架构

(2)若是select返回值正常(>0),则调用accept,接收客户端请求;函数

(3)调用recv接收客户端数据;线程

(4)解析收到的TCP裸数据;server

其软件架构以下图所示::事件


问题:数据接收开始是正常的,过一阵子就接收不到数据了,select老是返回0

初步怀疑:软件

(1)因为发送的subscribe订阅请求是有超时限制的,所以必须在超时前向upnp server发送续订请求。select

代码初步改动以下:bug

按这种思路,添加续订请求后,问题依然存在,百思不得其解。

经过wireshark抓包分析,发现这种状况下,个人机器是收到了upnp server的notify消息的。

那为何个人TCP程序却解析不到呢?

经过添加打印发现,异常状况下, select函数始终返回0.也就是说,个人TCP服务器程序始终认为没有数据可读或超。这是一个很奇怪的现象。

所以断定这段TCP服务器程序存在bug。

 

问题解决:每次调用select以前,调用FD_ZERO清空可读文件句柄集,并调用FD_SET把TCP套接字添加到该fd_set类型的集合中。

 

代码对比:

相关文章
相关标签/搜索