Учитывая сокет 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?