1. 程式人生 > >如何判斷一個SOCKET連線是否已經斷開

如何判斷一個SOCKET連線是否已經斷開

1. 根據ERRNO和recv結果進行判斷

在UNIX/Linux下,非阻塞模式SOCKET可以採用recv+MSG_PEEK的方式進行判斷,其中MSG_PEEK保證了僅僅進行狀態判斷,而不影響資料接收

對於主動關閉的SOCKET, recv返回-1,而且errno被置為9(#define EBADF   9 /* Bad file number */)或104 (#define ECONNRESET 104 /* Connection reset by peer */)

對於被動關閉的SOCKET,recv返回0,而且errno被置為11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

 對正常的SOCKET, 如果有接收資料,則返回>0, 否則返回-1,而且errno被置為11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

因此對於簡單的狀態判斷(不過多考慮異常情況):

  •     recv返回>0,   正常
  •     返回-1,而且errno被置為11  正常
  •     其它情況    關閉
  1. int np_socket_alive (int conn_fd) {  
  2. char buff[32];  
  3. int recv_buff = recv (conn_fd, buff, sizeof (buff), MSG_PEEK);  
  4. int sockErr = errno;  
  5.     if (recv_buff > 0)  // Get Data
  6.         return 1;  
  7.     if ((recv_buff == -1) && (sockErr == EWOULDBLOCK))  // No Data recieved
  8.         return 1;  
  9.     return -1;  
  10. }  

2. 通過TCP_KEEPALIVE進行判斷

參考子文獻: