Учитывая сокет Windows, я хочу определить, какие значения он использует для простоя TCP keepalive и времени интервала keepalive TCP (примерно эквивалентно TCP_KEEPIDLE
и TCP_KEEPINTVL
настроек на гнездах Berkeley).Чтение полей SIO_KEEPALIVE_VALS в сокете Windows (для неактивного времени ожидания и интервала времени)
Я вижу, что вы можете установить эти значения с помощью вызова 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).
Вышеупомянутая проблема также указывает на то, что не знаю, что такое текущие значения: я не могу установить только одно из оставшихся в режиме keepalive или интервала keepalive - я должен одновременно сдуть оба (неизвестных) значения поскольку они оба являются членами структуры, которую я должен предоставить.
Я знаю, что могу предположить, какие значения установлены на основе документации Windows, но я бы предпочел не предполагать. Я вижу, что http://technet.microsoft.com/en-us/library/bb726981.aspx#EDAA определяет KeepAliveInterval
и KeepAliveTime
значения по умолчанию. Однако папка «Параметры» в моем реестре Windows 7 не содержит ни одного из этих ключей, поэтому мне действительно нужно полагаться на то, что документация на 100% правильная здесь (чтобы знать значения по умолчанию, получаемые сокетом), что намного хуже, чем программно получение их (даже извлечение их из реестра может быть в порядке, но приведенный выше опыт показывает, что я не могу).
Есть ли способ получить текущий простоя TCP keepalive и временные интервалы времени ожидания TCP для сокета Windows?
Это из-за вашего опыта? Вы обнаружили это из какого-то определенного источника? Мне просто интересно, как вы это знаете. –
Err, документация? [Getsockopt()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms738544%28v=vs.85%29.aspx); [Setsockopt()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx); [WSAIoctl()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms741621%28v=vs.85%29.aspx). – EJP
Ну, Реми сказал, что «нет никакого способа прочитать текущие значения SIO_KEEPALIVE_VALS для сокета», что довольно решительно. Легко найти документы, которые говорят, что что-то возможно, но трудно доказать, что что-то невозможно. Проанализировали ли вы все соответствующие документы и решили, что это невозможно (те, которые вы перечислили, не являются исчерпывающими)? Или нашел другой источник, который говорит, что это так? –