Чтение полей SIO_KEEPALIVE_VALS в сокете Windows (для поддержания активности в режиме простоя и интервалов)

Учитывая сокет Windows, я хочу определить, какие значения он использует для времени простоя проверки активности TCP и времени интервала проверки активности TCP (примерно эквивалентны настройкам 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; снова см. 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. Однако папка «Параметры» в моем реестре Windows 7 не содержит ни одного из этих ключей, поэтому мне действительно приходится полагаться на то, что документация здесь на 100% верна (чтобы узнать значения по умолчанию, которые получит сокет), что намного хуже, чем программно их извлечение (даже извлечение их из реестра может быть в порядке, но приведенный выше опыт показывает, что я не могу).

Есть ли способ получить текущее время простоя поддержания активности TCP и значения времени интервала поддержания активности TCP для сокета 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