TCP服務器如何判斷客戶端Socket斷開連接 - ZYNQ7021學習

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章