2013-08-22 3 views
3

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

ответ

1

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

+0

Это из-за вашего опыта? Вы обнаружили это из какого-то определенного источника? Мне просто интересно, как вы это знаете. –

+1

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

+0

Ну, Реми сказал, что «нет никакого способа прочитать текущие значения SIO_KEEPALIVE_VALS для сокета», что довольно решительно. Легко найти документы, которые говорят, что что-то возможно, но трудно доказать, что что-то невозможно. Проанализировали ли вы все соответствующие документы и решили, что это невозможно (те, которые вы перечислили, не являются исчерпывающими)? Или нашел другой источник, который говорит, что это так? –