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 检索特定的错误代码。
错误代码 | 含义 |
---|---|
在使用此函数之前,必须成功调用 WSAStartup 。 |
|
网络子系统发生故障。 |
|
optval 或 optlen 参数之一指向不在用户地址空间有效部分中的内存。 如果 optlen 参数指向的值小于 DWORD 值的大小,则也会返回此错误。 |
|
阻止 Windows 套接字 1.1 调用正在进行,或者服务提供商仍在处理回调函数。 |
|
级别参数未知或无效。 在 Windows Vista 及更高版本中,如果套接字处于过渡状态,也会返回此错误。 |
|
选项未知或不受所指示的协议系列支持。 如果在 s 参数中传递的套接字描述符是针对数据报套接字,则返回此错误。 |
|
:描述符不是套接字。 |
注解
使用 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。 通过 TcpMaxDataRetransmissions 和 PPTPTcpMaxDataRetransmissions 注册表设置可以控制保持连接探测的数量。 保持连接探测数设置为两个注册表项值中的较大值。 如果此数字为 0,则不会发送保持连接探测。 如果此数字高于 255,则将其调整为 255。
在 Windows Vista 及更高版本上,仅当套接字处于已知状态而不是过渡状态时,才能使用 setockopt 函数设置SO_KEEPALIVE套接字选项。 对于 TCP,应在连接函数 (connectEx、WSAConnect、WSAConnectByList 或 WSAConnectByName) 调用连接函数之前或实际完成连接请求之后设置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 [仅限桌面应用] |
标头 |
|