如何在C語言中判斷socket是否已經斷開

2022-10-03 23:45:20 字數 1016 閱讀 1029

下面來介紹判斷非阻塞socket是否已經斷開的幾種方法:

注意要區分不同作業系統分別進行測試, 包括windows, linux和unix會各有不同。

在windows下比較簡單,可以使用fd_close事件判斷socket是否已經斷開

view plaincopy to clipboardprint?

bool issocketclosed(socket clientsockewww.cppcns.comt)

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

對於主動關閉的socket, recv返回-1,而且errno被置為9(#define ebadf   9 /* bad file number */)

或104 (#www.cppcns.comdefine 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 */)

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

recv0,   正常

返回-1,而且errno被置為11  正常

其它情況    關閉

view plaincopy to clipboardprint?

#include

bool issocketclosed(int clientsocket)

此外,所有作業系統上還可以通過tcp_keeplive實行心跳檢測。

本文標題: 如何在c語言中判斷socket是否已經斷開

本文位址: /ruanjian/c/259751.html

如何在C語言中呼叫shell命令

1 system 執行shell 命令 相關函式 fork,execve,waitpid,popen 表頭檔案 include 定義函式 int system const char string 函式說明 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c string來執行...

如何在C語言中呼叫shell命令

1 system 執行shell 命令 相關函式 fork,execve,waitpid,popen 表頭檔案 include 定義函式 int system const char string 函式說明 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c string來執行...

如何在C語言中呼叫shell命令

1 system 執行shell 命令 相關函式 fork,execve,waitpid,popen 表頭檔案 include 定義函式 int system const char string 函式說明 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c string來執行...