SO_KEEPALIVE套接字选项

SO_KEEPALIVE套接字选项旨在允许应用程序为套接字连接启用保持连接数据包。

若要查询此套接字选项的状态,请调用 getsockopt 函数。 若要设置此选项,请使用以下参数调用 setsockopt 函数。

套接字选项值

表示此套接字选项的常量0x0008。

语法

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_KEEPALIVE, // optname
  (char *) optval, // input buffer,
  (int) optlen  // size of input buffer
);

参数

s [in]

标识套接字的描述符。

level [in]

定义选项的级别。 对此操作使用 SOL_SOCKET

optname [in]

要为其设置值的套接字选项。 对此操作使用 SO_KEEPALIVE

optval [out]

指向缓冲区的指针,其中包含要设置的选项的值。 此参数应指向等于或大于 DWORD 值大小的缓冲区。

此值被视为布尔值,0 用于指示 FALSE (禁用) ,非零值表示 TRUE () 启用。

optlen [in]

optval 缓冲区的大小(以字节为单位)。 此大小必须等于或大于 DWORD 值的大小。

返回值

如果操作成功完成, 则 setsockopt 返回零。

如果操作失败,则返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 检索特定的错误代码。

错误代码 含义
WSANOTINITIALISED
在使用此函数之前,必须成功调用 WSAStartup
WSAENETDOWN
网络子系统发生故障。
WSAEFAULT
optvaloptlen 参数之一指向不在用户地址空间有效部分中的内存。 如果 optlen 参数指向的值小于 DWORD 值的大小,则也会返回此错误。
WSAEINPROGRESS
阻止 Windows 套接字 1.1 调用正在进行,或者服务提供商仍在处理回调函数。
WSAEINVAL
级别参数未知或无效。 在 Windows Vista 及更高版本中,如果套接字处于过渡状态,也会返回此错误。
WSAENOPROTOOPT
选项未知或不受所指示的协议系列支持。 如果在 s 参数中传递的套接字描述符是针对数据报套接字,则返回此错误。
WSAENOTSOCK
:描述符不是套接字。

 

注解

使用 SO_KEEPALIVE 套接字选项调用的 getsockopt 函数允许应用程序检索 keepalive 选项的当前状态,尽管此功能通常不使用。 如果应用程序需要在套接字上启用 keepalive 数据包,它只需调用 setsockopt 函数来启用 选项。

使用 SO_KEEPALIVE 套接字选项调用的 setsockopt 函数允许应用程序为套接字连接启用保持连接数据包。 默认情况下,禁用套接字的 SO_KEEPALIVE 选项, (设置为 FALSE) 。

启用此套接字选项后,当某个时间间隔内没有为连接收到任何数据或确认数据包时,TCP 堆栈将发送保持连接数据包。 有关“保持连接”选项的详细信息,请参阅 IETF 网站上提供的有关 Internet 主机的要求 - RFC 1122 中指定的通信层的第 4.2.3.6 部分。 (此资源可能仅以英语提供。)

SO_KEEPALIVE套接字选项仅对支持“保持连接”概念 (面向连接的协议) 有效。 对于 TCP,默认保持连接超时为 2 小时,保持连接间隔为 1 秒。 默认的保持连接探测数因 Windows 版本而异。

SIO_KEEPALIVE_VALS控制代码可用于启用或禁用保持连接,并调整单个连接的超时和间隔。 如果使用 SO_KEEPALIVE 启用 keep-alive,则默认 TCP 设置将用于保持连接超时和间隔,除非已使用 SIO_KEEPALIVE_VALS 更改这些值。

keep-alive 超时的默认系统范围值可通过 KeepAliveTime 注册表设置进行控制,该设置采用以毫秒为单位的值。 keep-alive 间隔的默认系统范围值可通过 KeepAliveInterval 注册表设置进行控制,该设置采用以毫秒为单位的值。

在 Windows Vista 及更高版本上,) 数据重新传输 (保持连接探测数设置为 10,无法更改。

在 Windows Server 2003、Windows XP 和 Windows 2000 上,保持连接探测数的默认设置为 5。 通过 TcpMaxDataRetransmissionsPPTPTcpMaxDataRetransmissions 注册表设置可以控制保持连接探测的数量。 保持连接探测数设置为两个注册表项值中的较大值。 如果此数字为 0,则不会发送保持连接探测。 如果此数字高于 255,则将其调整为 255。

在 Windows Vista 及更高版本上,仅当套接字处于已知状态而不是过渡状态时,才能使用 setockopt 函数设置SO_KEEPALIVE套接字选项。 对于 TCP,应在连接函数 (connectExWSAConnect、WSAConnectByListWSAConnectByName) 调用连接函数之前或实际完成连接请求之后设置SO_KEEPALIVE套接字选项。 如果 connect 函数是异步调用的,则需要等待连接完成,然后再尝试设置 SO_KEEPALIVE 套接字选项。 如果应用程序尝试在连接请求仍在处理时设置 SO_KEEPALIVE 套接字选项, 则 setsockopt 函数将失败并返回 WSAEINVAL

在 Windows Server 2003、Windows XP 和 Windows 2000 上, 当套接字为 过渡状态 (连接请求仍在进行) 以及已知状态时,可以使用 setockopt 函数设置SO_KEEPALIVE套接字选项。

请注意, Ws2def.h 头文件会自动包含在 Winsock2.h 中,永远不应直接使用。

要求

要求
最低受支持的客户端
Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器
Windows 2000 Server [仅限桌面应用]
标头
Ws2def.h (包括 Winsock2.h)

另请参阅

getsockopt

setsockopt

KeepAliveTime

KeepAliveInterval

PPTPTcpMaxDataRetransmissions

socket

SIO_KEEPALIVE_VALS

TcpMaxDataRetransmissions

WSAGetLastError