SIO_KEEPALIVE_VALS控制代码

说明

SIO_KEEPALIVE_VALS控制代码启用或禁用 TCP 保持连接选项的每个连接设置,该选项指定 TCP 保持连接超时和间隔。

若要执行此操作,请使用以下参数调用 WSAIoctlWSPIoctl 函数。

int WSAIoctl(
  (socket) s,              // descriptor identifying a socket
  SIO_KEEPALIVE_VALS,                  // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to tcp_keepalive struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,              // descriptor identifying a socket
  SIO_KEEPALIVE_VALS,                  // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to tcp_keepalive struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

参数

S

标识套接字的描述符。

dwIoControlCode

操作的控制代码。 对此操作使用 SIO_KEEPALIVE_VALS

lpvInBuffer

指向输入缓冲区的指针。 此参数应指向 tcp_keepalive 结构。

cbInBuffer

输入缓冲区的大小(以字节为单位)。 此参数应等于或大于 lpvInBuffer 参数指向的 tcp_keepalive 结构的大小。

lpvOutBuffer

指向输出缓冲区的指针。 此参数未用于此操作。

cbOutBuffer

输出缓冲区的大小(以字节为单位)。 该参数必须设置为零。

lhttpBytesReturned

指向变量的指针,该变量接收输出缓冲区中存储的数据的大小(以字节为单位)。 此返回的参数指向此操作的 DWORD 值零,因为没有输出。

lpvOverlapped

指向 WSAOVERLAPPED 结构的指针。

如果 创建的套接字 没有重叠属性,则忽略 lpOverlapped 参数。

如果使用重叠属性打开了 并且 lpOverlapped 参数不为 NULL,则该操作将作为重叠 (异步) 操作执行。 在这种情况下, lpOverlapped 参数必须指向有效的 WSAOVERLAPPED 结构。

对于重叠操作, WSAIoctlWSPIoctl 函数将立即返回,并在操作完成时发出相应的完成方法信号。 否则,在操作完成或发生错误之前,函数不会返回 。

lpCompletionRoutine

类型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

指向完成操作时调用的完成例程的指针, (忽略非重叠套接字) 。

lpThreadId

指向 WSATHREADID 结构的指针,供提供程序在后续调用 WPUQueueApc 时使用。 在 WPUQueueApc 函数返回之前,提供程序应存储引用的 WSATHREADID 结构 (而不是指向同一) 的指针。

注意 此参数仅适用于 WSPIoctl 函数。

lpErrno

指向错误代码的指针。

注意 此参数仅适用于 WSPIoctl 函数。

返回值

如果操作成功完成, WSAIoctlWSPIoctl 函数将返回零。

如果操作失败或挂起, WSAIoctlWSPIoctl 函数将返回 SOCKET_ERROR。 若要获取扩展的错误信息,请调用 WSAGetLastError

错误代码 含义
WSA_IO_PENDING 已成功启动重叠操作,稍后将指示完成。
WSA_OPERATION_ABORTED 由于套接字关闭或执行 了 SIO_FLUSH IOCTL 命令,已取消重叠的操作。
WSAEFAULT lpOverlappedlpCompletionRoutine 参数并不完全包含在用户地址空间的有效部分。
WSAEINPROGRESS 当回调正在进行时,将调用 函数。
WSAEINTR 阻止操作中断。
WSAEINVAL dwIoControlCode 参数不是有效的命令,或者指定的输入参数不可接受,或者该命令不适用于指定的套接字类型。
WSAENETDOWN 网络子系统失败。
WSAENOPROTOOPT 指定协议不支持套接字选项。 对数据报套接字返回此错误。
WSAENOTSOCK 描述符 不是套接字。
WSAEOPNOTSUPP 不支持指定的 IOCTL 命令。 如果传输提供程序不支持 SIO_KEEPALIVE_VALS IOCTL,则返回此错误。

备注

SIO_KEEPALIVE_VALS IOCTL 在 Windows 2000 及更高版本的操作系统上受支持。

SIO_KEEPALIVE_VALS控制代码启用或禁用 TCP 保持连接选项的每个连接设置,该选项指定用于 TCP 保持连接数据包的 TCP 保持连接超时和间隔。 有关“保持连接”选项的详细信息,请参阅 IETF 网站上提供的有关 Internet 主机的要求 - RFC 1122 中指定的通信层的第 4.2.3.6 部分。 (此资源可能仅提供英语。)

lpvInBuffer 参数应指向 Mstcpip.h 头文件中定义的tcp_keepalive结构。 此结构定义如下:

/* Argument structure for SIO_KEEPALIVE_VALS */
struct tcp_keepalive {
    u_long  onoff;
    u_long  keepalivetime;
    u_long  keepaliveinterval;
};

onoff 成员中指定的值确定是启用还是禁用 TCP 保持连接。 如果 onoff 成员设置为非零值,则启用 TCP 保持连接并使用结构中的其他成员。 keepalivetime 成员指定超时(以毫秒为单位),在发送第一个 keep-alive 数据包之前没有活动。 keepaliveinterval 成员指定在未收到确认的情况下发送连续保持连接数据包之间的间隔(以毫秒为单位)。

SO_KEEPALIVE选项(SOL_SOCKET套接字选项之一)还可用于启用或禁用连接上的 TCP 保持连接状态,以及查询此选项的当前状态。 若要查询是否在套接字上启用了 TCP 保持连接,可以使用 SO_KEEPALIVE 选项调用 getsockopt 函数。 若要启用或禁用 TCP 保持连接,可以使用 SO_KEEPALIVE 选项调用 setsockopt 函数。 如果使用 SO_KEEPALIVE 启用 TCP 保持连接,则默认 TCP 设置用于保持连接超时和间隔,除非已使用 SIO_KEEPALIVE_VALS 更改这些值。

keep-alive 超时的默认系统范围值可通过 KeepAliveTime 注册表设置进行控制,该设置采用以毫秒为单位的值。 如果未设置密钥,则默认保持连接超时为 2 小时。 keep-alive 间隔的默认系统范围值可通过 KeepAliveInterval 注册表设置进行控制,该设置采用以毫秒为单位的值。 如果未设置密钥,则默认保持连接间隔为 1 秒。

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

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

另请参阅

KeepAliveTime

KeepAliveInterval

PPTPTcpMaxDataRetransmissions

socket

SO_KEEPALIVE

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW