Socket服務端一直收空包的緣由與解決方法

最近作socket服務端,大部分時候系統是正常的,可是運行個一段時間就會一直以超高的頻率收到不少數據,一開始覺得是下位機上報的,沒怎麼上心,後來下位機工程師說他們沒上報,因此從新看了下代碼,發現程序會一直調用 netStream.BeginRead,EndRead,一直收數據,並且受到的數據包都是0字節,百度了20分鐘,大神們說socket客戶端正常關閉的時候服務端會收到一個長度是0的數據包,若是一直循環調用會一直收到,原話以下服務器

 

出現緣由:1、用戶正常退出,這時你還循環調用了Receive方法時會出現。並會陷入死循環。
    2、用戶非正常退出,包括拔網線,死機,服務器會捕捉到一個異常
處理方法:1、你只要在循環裏對數據進行判斷一下,若是數據爲0就停止循環,並關閉此Socket鏈接便可socket

 

確實是這樣,測試的客戶端沒寫socket.Clost(),都是直接關閉,因此能不作的客戶端退出;當客戶端點擊斷開鏈接後服務端就會收到一個空包,並且Connected仍是true,若是沒判斷是不是空包的換會一直循環接收空包,因此每次收到數據的時候須要判斷是包的長度,若是是0就中斷循環,並關閉socket。測試

 

新人私人備忘,若是有說錯的地方但願大神指出。百度

相關文章
相關標籤/搜索