當前位置:編程學習大全網 - 網站源碼 - 如何判斷socket已經斷開

如何判斷socket已經斷開

Socket在連接以後,如果客戶端非正常退出,比如網線掉了、超時退出等,服務器端的socket仍然有緩存,此時可以從該socket描述符中讀出壹些數據,短時間內甚至可以寫,因此判斷TCP socket是否斷開及其不易,網上有很多方法,都不能精確判斷。本人用select()和recv寫了壹個,在緩沖區被讀完以後判斷非常管用。這裏,recv時使用MSG_PEEK參數,數據不會從緩沖區中清除掉,因此不會影響正常的讀寫。

/* check whether socket is connected. Actually, it is not accurate if the client

* crashs and the server don't know about it because the socket buffer is ready.

* So the return value '0' doesn't mean the socket is really valid. Of course,

* '-1' shows the socket is invalid*/int checksock(int s){fd_set fds;

char buf[2];

int nbread;

FD_ZERO(&fds);

FD_SET(s,&fds);

if ( select()(s+1, &fds, (fd_set *)0, (fd_set *)0, NULL) == -1 ) {

//log(LOG_ERR,"select()(): %s\n",strerror(errno)) ;return -1;}if (!FD_ISSET(s,&fds)) {

//log(LOG_ERR,"select() returns OK but FD_ISSET not\n") ;return -1;}/* read one byte from socket */

  • 上一篇:YOLO模型和mtcnn模型對比,在做人臉識別時,有何不同?
  • 下一篇:linux c++源代碼,如何隱藏源代碼中的常量字符串?使得通過反匯編難以獲取到此字符串。 不使用加殼。
  • copyright 2024編程學習大全網