3

给定一个 Windows 套接字,我想确定它用于 TCP keepalive 空闲时间和 TCP keepalive 间隔时间的值(大致相当于 Berkeley 套接字上的TCP_KEEPIDLEandTCP_KEEPINTVL设置)。

我看到您可以使用WSAIoctl调用设置这些值(请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx)。但是,似乎没有任何 API 可以读取它们的当前值。我尝试WSAIoctl使用填充的输出参数但NULL输入参数调用,如下所示:

DWORD bytes_returned;
struct tcp_keepalive keepalive_opts;
int rv = WSAIoctl(socket, SIO_KEEPALIVE_VALS, NULL, 0, &keepalive_opts, sizeof(keepalive_opts), &bytes_returned, NULL, NULL);

但这会给我返回一个WSAEFAULT(“系统在尝试在调用中使用指针参数时检测到无效的指针地址。”)。

我可以WSAIoctl同时使用输入和输出参数进行调用,但我不想设置这些值,我只想读取它们。据我所知,提供任何非NULL输入参数都会导致参数被设置为该内存空间中发生的任何值(由struct tcp_keepalive; 定义,再次参见http://msdn.microsoft.com/en-我们/图书馆/windows/desktop/dd877220%28v=vs.85%29.aspx)。

上面还强调了另一个不知道当前值是什么的问题:我不能只设置一个 keepalive 空闲时间或 keepalive 间隔时间——我必须同时消除两个(未知)值,因为它们是我需要提供的结构的两个成员。

我知道我可以假设基于 Windows 文档设置了哪些值,但我不想假设。我看到http://technet.microsoft.com/en-us/library/bb726981.aspx#EDAA定义KeepAliveIntervalKeepAliveTime默认值。但是,我的 Windows 7 注册表中的 Parameters 文件夹不包含这些键中的任何一个,所以我真的必须依赖这里 100% 正确的文档(要知道套接字将接收的默认值),这比编程要糟糕得多检索它们(即使从注册表中检索它们也可以,但上述经验表明我不能)。

有什么方法可以获取 Windows 套接字的当前 TCP keepalive 空闲时间和 TCP keepalive 间隔时间值?

4

1 回答 1

1

TCP_KEEPIDLE和不同TCP_KEEPINTVL,可以与 一起使用getsockopt(),没有办法读取SIO_KEEPALIVE_VALS套接字的当前值,只能设置它们。

于 2013-08-22T23:44:10.820 回答