"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類型的集合中。

 

代碼對比:

相關文章
相關標籤/搜索