"select一直返回0"的問題解決和總結


場景:一個簡單的TCP 服務器,以實現UPNP的事件體系結構

我在linux平台下,創建一個TCP套接字,綁定到49156端口,向UPNP SERVER發一個subscribe訂閱請求,超時時間設置為5minutes.

然后開啟一個Thread_Main主接收線程。該線程完成以下工作:

(1)調用select監聽是否有數據可讀,設置4s的超時;

(2)如果select返回值正常(>0),則調用accept,接收客戶端請求;

(3)調用recv接收客戶端數據;

(4)解析收到的TCP裸數據;

其軟件架構如下圖所示::


問題:數據接收開始是正常的,過一陣子就接收不到數據了,select總是返回0

初步懷疑:

(1)由於發送的subscribe訂閱請求是有超時限制的,因此必須在超時前向upnp server發送續訂請求。

代碼初步改動如下:

按這種思路,添加續訂請求后,問題依然存在,百思不得其解。

通過wireshark抓包分析,發現這種情況下,我的機器是收到了upnp server的notify消息的。

那為什么我的TCP程序卻解析不到呢?

通過添加打印發現,異常情況下, select函數始終返回0.也就是說,我的TCP服務器程序始終認為沒有數據可讀或超。這是一個很奇怪的現象。

因此判定這段TCP服務器程序存在bug。

 

問題解決:每次調用select之前,調用FD_ZERO清空可讀文件句柄集,並調用FD_SET把TCP套接字添加到該fd_set類型的集合中。

 

代碼對比:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM