Linux網路程式設計中服務端判斷客戶端斷開連線。
阿新 • • 發佈:2019-02-18
</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; }