Учитывая сокет 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
значения по умолчанию. Однако папка Parameters в моем реестре Windows 7 не содержит ни одного из этих ключей, поэтому я действительно должен полагаться на то, что документация здесь на 100% правильная (чтобы знать значения по умолчанию, которые получит сокет), что намного хуже, чем программно их извлечение (даже извлечение их из реестра может быть в порядке, но вышеприведенный опыт показывает, что я не могу).
Есть ли способ получить текущее время простоя активности активности TCP и значения интервала времени активности активности TCP для сокета Windows?
В отличие от TCP_KEEPIDLE
а также TCP_KEEPINTVL
, который может быть использован с getsockopt()
нет возможности прочитать текущую SIO_KEEPALIVE_VALS
значения для сокета, только для их установки.
Других решений пока нет …