Четене на полета SIO_KEEPALIVE_VALS в сокет на Windows (за поддържане на активност в неактивност и интервали)

Като се има предвид сокет на 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?


person Denver Gingerich    schedule 22.08.2013    source източник


Отговори (1)


За разлика от TCP_KEEPIDLE и TCP_KEEPINTVL, които могат да се използват с getsockopt(), няма начин да се прочетат текущите SIO_KEEPALIVE_VALS стойности за сокет, а само да се зададат.

person Remy Lebeau    schedule 22.08.2013
comment
Това от твоя опит ли е? Намерихте ли това от някакъв сигурен източник? Просто съм любопитен откъде знаеш, че случаят е такъв. - person Denver Gingerich; 23.08.2013
comment
Грешка, документацията? getsockopt(); setsockopt(); WSAIoctl(). - person user207421; 23.08.2013
comment
Е, Реми каза, че няма начин да се прочетат текущите стойности на SIO_KEEPALIVE_VALS за сокет, което е доста решаващо. Лесно е да се намерят документи, които казват, че нещо е възможно, но е трудно да се докаже, че нещо е невъзможно. Прегледахте ли всички съответни документи и решихте ли, че е невъзможно (изброените от вас не са изчерпателни)? Или намерих друг източник, който казва, че е така? - person Denver Gingerich; 23.08.2013
comment
Има противоречива информация по този въпрос. Този сайт твърди, че можете да правите заявки за текущите стойности, като подадете tcp_keepalive като изходен буфер за SIO_KEEPALIVE_VALS, но MSDN казва, че SIO__KEEPALIVE_VALS игнорира изходния буфер. Опитах го, изходът tcp_keepalive не се актуализира след извършване на множество SIO_KEEPALIVE_VALS извиквания и параметърът lpcbBytesReturned винаги връща 0. - person Remy Lebeau; 23.08.2013