如何判斷一個SOCKET連線是否已經斷開
阿新 • • 發佈:2019-01-23
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 正常
- 其它情況 關閉
- int np_socket_alive (int conn_fd) {
- char buff[32];
-
int recv_buff = recv (conn_fd, buff, sizeof (buff), MSG_PEEK);
- int sockErr = errno;
- if (recv_buff > 0) // Get Data
- return 1;
- if ((recv_buff == -1) && (sockErr == EWOULDBLOCK)) // No Data recieved
- return 1;
- return -1;
- }