1. 程式人生 > >TCP伺服器如何判斷客戶端Socket斷開連線

TCP伺服器如何判斷客戶端Socket斷開連線

       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,可以判斷客戶端是否已經斷開。