TCP伺服器如何判斷客戶端Socket斷開連線
阿新 • • 發佈:2019-02-05
ARM上基於Linux編寫的 TCP 伺服器,當客戶端斷開連線時,使用 select 函式的情況下,伺服器仍然會接收到一個訊號,在 select 函式會將這個裝置描述符標記為可讀/寫,然後呼叫 recv 函式,若 recv 函式返回值為 0,則表示客戶端已經斷開,伺服器需要將對應的 Socket 套接字關閉掉,讓資料寫回磁碟,並釋放檔案所佔用的資源。
第一步
判斷多路接入的客戶端對否有處於可讀/寫狀態的裝置,若客戶端斷開,也會觸發可讀/寫狀態。
selectNum = select(fdmax + 1, &fdr, NULL, NULL, &SelectTimeOut);
第二步
判斷是否 fdr 集合中的裝置觸發 select 函式返回,再判斷 recv 的返回值,如果 ret 大於 0 ,則正常接收到資料;如果 ret 等於 0 ,則表示客戶端異常(斷開),需要關閉相應的套接字;如果 ret 小於 0,則表示接收出錯。
if (FD_ISSET(client[i], &fdr)) { ret = recv(client[i], buf, sizeof(buf), 0); if (ret > 0) { printf("client%d receive: %s %d\n", i + 1, buf, ret); } else if (ret == 0) { if (close(client[i]) >= 0) { printf("close socket success cfd=%d \n", client[i]); FD_CLR(client[i], &fdr); //後續其他處理 } } else { perror("recv"); exit(-1); } }
總結
通過 select 函式判斷之後,再判斷 recv 函式的返回值是否為 0,可以判斷客戶端是否已經斷開。