鉴于Windows套接字,我想确定它用于TCP keepalive空闲时间和TCP keepalive间隔时间的值(大致相当于Berkeley套接字上的TCP_KEEPIDLE
和TCP_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间隔时间值?
答案 0 :(得分:1)
与可以与TCP_KEEPIDLE
一起使用的TCP_KEEPINTVL
和getsockopt()
不同,无法读取套接字的当前SIO_KEEPALIVE_VALS
值,只能设置它们。