读取Windows套接字上的SIO_KEEPALIVE_VALS字段(用于keepalive空闲和间隔时间)

时间:2013-08-22 21:43:48

标签: c++ windows sockets tcp keep-alive

鉴于Windows套接字,我想确定它用于TCP keepalive空闲时间和TCP keepalive间隔时间的值(大致相当于Berkeley套接字上的TCP_KEEPIDLETCP_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输入参数会导致参数设置为该内存空间中的任何值(由KeepAliveInterval定义;再次参见{{ 3}})。

上面还强调了另一个问题,即不知道当前值是什么:我不能只设置keepalive空闲时间或keepalive间隔时间之一 - 我必须同时吹掉两个(未知)值他们都是我要提供的结构的成员。

我知道我可以假设基于Windows文档设置了什么值,但我不想假设。我看到http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx定义了KeepAliveTime和{{1}}默认值。但是,我的Windows 7注册表中的Parameters文件夹不包含这些键中的任何一个,所以我真的必须依赖这里100%正确的文档(知道套接字将接收的默认值),这比编程更糟糕检索它们(甚至从注册表中检索它们可能没问题,但上面的经验表明我不能)。

有没有办法获取Windows套接字的当前TCP keepalive空闲时间和TCP keepalive间隔时间值?

1 个答案:

答案 0 :(得分:1)

与可以与TCP_KEEPIDLE一起使用的TCP_KEEPINTVLgetsockopt()不同,无法读取套接字的当前SIO_KEEPALIVE_VALS值,只能设置它们。