場景:一個簡單的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類型的集合中。
代碼對比:

