2009-12-15 17 views
0

我已經使用C++ CSocket創建了客戶端服務器應用程序。當我連接客戶端到服務器之後,我用普通的X按鈕關閉客戶端,或者用taskmanager結束任務,服務器CSocket接收到OnClose事件。問題是當我禁用運行客戶端的Windows上的Internet連接時,服務器CSocket不會收到OnClose或OnReceive事件!當您在客戶端禁用網絡連接時,CSocket不會收到OnClose或OnReceive

有人可能知道發生了什麼嗎?

更新:我剛剛測試過,看到客戶端也沒有收到OnClose呢!我禁用了客戶端運行的窗口上的Internet連接!

回答

1

客戶端已關閉,但無法通過FIN或RST關閉與服務器的連接。爲了讓服務器檢測到客戶端已經死亡,它必須要麼發送數據(這將失敗),要麼必須定期發送TCP保持活動探測。 TCP_KEEPALIVE可以設置爲套接字選項。

+0

謝謝,我應該在服務器和客戶端上保持活力嗎? – EBAG

+1

取決於你想要保護的東西。 如果啓用服務器端保持活動,以防止連接處於休眠狀態,以防上述客戶端關閉。同樣,這隻在服務器從不寫入套接字的情況下才是必需的。 由於大概您的客戶端正在寫入套接字,並且如果客戶端連接消耗資源,客戶端keepalive可能意義不大,所以通常沒什麼大不了的。 –

相關問題