1. 程式人生 > >Linux網路程式設計中服務端判斷客戶端斷開連線。

Linux網路程式設計中服務端判斷客戶端斷開連線。

</pre> 專案使用了select模型,所以這裡只貼出此模型下的客戶端連線斷開判斷:<p></p><p>主要是select返回後,正常recv,如果recv的返回值小於0則表示客戶端連線已斷開。</p><p></p>
<pre name="code" class="cpp">/*select等待*/
err = select(maxfd + 1, &scanfd, NULL, NULL, &timeout) ;
switch(err)
{
	case 0:/*超時*/
		//g_log.Error("連線超時!");
		break;

	case -1:/*錯誤發生*/
		g_log.Error("連線異常!");
		break;

	default:/*有可讀套接字檔案描述符*/
		//g_log.Debug( "data come" );
		if(m_connect_number<=0)
			break;
		for(i = 0; i < TCPServer::m_maxClient; i++)
		{
			/*查詢啟用的檔案描述符*/

			if( m_pconnectHost[i] != -1 )
			{
				if( FD_ISSET(m_pconnectHost[i], &scanfd) )
				{

					memset( &m_pbuf[0], 0, m_bufLen );/*清零*/
					n = recv( m_pconnectHost[i], &m_pbuf[0], m_bufLen, 0);/*接收發送方資料*/
					if(n > 0)/*判斷是否合法接收資料*/
					{
						memset( &m_pbuf[0], 0, m_bufLen);/*清零*/
						now = time(NULL);/*當前時間*/
						sprintf( &m_pbuf[0], "%24s\r\n",ctime(&now));/*將時間拷貝入緩衝區*/
						g_log.Debug( string(&m_pbuf[0]) );
						send(m_pconnectHost[i], &m_pbuf[0], strlen( &m_pbuf[0] ),0);/*傳送資料*/
					}
					else
					{
						g_log.Error("客戶端連線已關閉!");
						/*關閉客戶端*/
						close(m_pconnectHost[i]);
						/*更新檔案描述符在陣列中的值*/
						m_pconnectHost[i] = -1;
						m_connect_number --;	/*客戶端計數器減1*/
					}


				}
			}

		}
		break;
}