我在linux平臺下,建立一個TCP套接字,綁定到49156端口,向UPNP SERVER發一個subscribe訂閱請求,超時時間設置爲5minutes.linux
而後開啓一個Thread_Main主接收線程。該線程完成如下工做:服務器
(1)調用select監聽是否有數據可讀,設置4s的超時;架構
(2)若是select返回值正常(>0),則調用accept,接收客戶端請求;函數
(3)調用recv接收客戶端數據;線程
(4)解析收到的TCP裸數據;server
其軟件架構以下圖所示::事件
初步懷疑:軟件
(1)因爲發送的subscribe訂閱請求是有超時限制的,所以必須在超時前向upnp server發送續訂請求。select
代碼初步改動以下:bug
按這種思路,添加續訂請求後,問題依然存在,百思不得其解。
經過wireshark抓包分析,發現這種狀況下,個人機器是收到了upnp server的notify消息的。
那爲何個人TCP程序卻解析不到呢?
經過添加打印發現,異常狀況下, select函數始終返回0.也就是說,個人TCP服務器程序始終認爲沒有數據可讀或超。這是一個很奇怪的現象。
所以斷定這段TCP服務器程序存在bug。
代碼對比: