Като се има предвид сокет на Windows, искам да определя кои стойности използва за времето на неактивност на TCP keepalive и времето на интервала на TCP keepalive (приблизително еквивалентно на настройките TCP_KEEPIDLE
и TCP_KEEPINTVL
на Berkeley sockets).
Виждам, че можете да зададете тези стойности с помощта на 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-us/library/windows/desktop/dd877220%28v=vs.85%29.aspx ).
Горното също подчертава друг проблем с това, че не знам какви са текущите стойности: не мога да задам само едно от времето на престой за поддържане на активността или времето за интервал на поддържане на активността - трябва да изтрия и двете (неизвестни) стойности едновременно, тъй като те са и двата члена на структурата, които трябва да предоставя.
Знам, че бих могъл да предположа неща за това какви стойности са зададени въз основа на документацията на Windows, но предпочитам да не предполагам. Виждам, че http://technet.microsoft.com/en-us/library/bb726981.aspx#EDAA дефинира KeepAliveInterval
и KeepAliveTime
стойности по подразбиране. Въпреки това, папката Parameters в моя регистър на Windows 7 не съдържа нито един от тези ключове, така че наистина трябва да разчитам на това, че документацията е 100% правилна тук (за да знам стойностите по подразбиране, които сокетът ще получи), което е много по-лошо от програмното извличането им (дори извличането им от регистъра може да е добре, но горният опит показва, че не мога).
Има ли някакъв начин да получите текущото време на неактивност на TCP keepalive и стойностите на времевия интервал на TCP keepalive за сокет на Windows?