最近一個集成專案除錯通訊介面時,為了充分利用多核CPU,了解學習了IOCP模型——學得略有心得,還不算全面正在完善實作網路監聽、客戶端、TCP連接、串口、HID、UDP客戶端、命名管道等均用其實作。1.0版本除錯好了,不滿意。遇到連接斷開處理方面的問題,在這里拋磚引玉深入探討:
比如說TCP連接中,服務器端呼叫DISCONNECTEX,如果客戶端不相應呼叫DISCONNECTEX或closesocket——如第三方做的客戶端,服務器端收不到回饋事件。1.0版本中,服務器端直接closesocket,可以起到斷開連接的功能,但是socket就不能重用了。
2.如果服務器端、客戶端都是具備DISCONNECTEX功能,設計思路如果接收到的資料長度為0,則DISCONNECTEX,這樣連接才可以“優雅”的完全斷開,但是必須有SEND方先DISCONNECTEX,接收方收到資料長度為則0,然后也就DISCONNECTEX,發送方收到回饋事件。這個連接優雅斷開。
現在有以下疑問
1.服務器端實作socket重用有多大意義?我做的是物聯網方面大約1000個用戶同時在線,也可能不斷斷開重連——2G網路不穩定,服務器端需要解決實時關閉非法連接、最大效率的并發……
2.前面2的思路實踐有效,是否完全正確,有沒有辦法解決客戶端發送、服務器接收,而服務器能夠DISCONNECTEX并斷開連接;心跳模式下,服務器既要接收終端資料,又要發送心跳包(對嗎?),主動DISCONNECT后,客戶端回應斷開,則一切OK。大家是這樣做的嗎?
uj5u.com熱心網友回復:
服務器端socket怎么實作啊?我理解著socket斷了再連就不是一個值了,并且SOCKET只是一個無符號整數,不存在創建耗費時間的問題。服務器端的IOCP應用應該一直投遞recv請求,一旦客戶端斷開連接應該會激活回呼函式且接收到的資料為0.不知道客戶端不呼叫closesocket會不會也這樣,忘了。
uj5u.com熱心網友回復:
1000個用戶同時在線
select io模型就夠用了。
uj5u.com熱心網友回復:
所謂斷開,是當發現接收例外、接收首包資料超時、接收后面的資料超時等情況時,呼叫DISCONNECTEX斷開連接;然后這個SOCKET還可以繼續作為ACCEPTEX的引數,等待下一個客戶端接入。發現只有接收例外(應該是客戶端斷開連接或例外退出)時,立即有IO事件回傳;其他情況需要等待客戶端斷開——如果斷開程序時間再超時,只能呼叫closesocket強制斷開,此時的SOCKET就不能重用了???。
問題就是:如果客戶端就是不斷開,可能是非法用戶;必須通過closesocket結束而不能重用這個socket了嗎?有必要重用嗎?連接出問題就closesocket,然后新建socket對性能有多大影響?
uj5u.com熱心網友回復:
應該是讓正常關閉的套接字(如,用戶關閉了客戶端,workthread里能收到的結束鏈接的套接字),置鏈表最尾端,重設等待用。讓心跳包后,不回復的套接字,使用closesocket,然后重新申請新的套接字資源.置鏈表最尾端,新設等待用。
uj5u.com熱心網友回復:
SOCK重用好像沒多大意義,而且不好維護。處理好業務就好uj5u.com熱心網友回復:
當客戶端例外斷開SOCKET后,DisconnectEx投遞可以立即回傳;
但是當Server端在處理超時Client時,投遞需要等待一段時間才能回傳,而且回傳時間不確定
https://blog.csdn.net/tpriwwq/article/details/18077091
如果并發量在1k左右,
個人感覺不需要在這一方面做優化
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/63994.html
標籤:網絡編程
下一篇:【WCE7】 PreTranslateMessage中doModal打開視窗后,過一段時間PostMessage就接收不到了
