Параметр сокета SO_KEEPALIVE
Параметр сокета SO_KEEPALIVE позволяет приложению поддерживать работоспособность пакетов для подключения к сокету.
Чтобы запросить состояние этого параметра сокета, вызовите функцию getsockopt . Чтобы задать этот параметр, вызовите функцию setsockopt со следующими параметрами.
Значение параметра сокета
Константой, представляющей этот параметр сокета, является 0x0008.
Синтаксис
int setsockopt(
(SOCKET) s, // descriptor identifying a socket
(int) SOL_SOCKET, // level
(int) SO_KEEPALIVE, // optname
(char *) optval, // input buffer,
(int) optlen // size of input buffer
);
Параметры
-
s [in]
-
Дескриптор, определяющий сокет.
-
level [in]
-
Уровень, на котором определен параметр. Для этой операции используйте SOL_SOCKET .
-
optname [in]
-
Параметр сокета, для которого необходимо задать значение. Для этой операции используйте SO_KEEPALIVE .
-
optval [out]
-
Указатель на буфер, содержащий значение заданного параметра. Этот параметр должен указывать на буфер, равный или превышающий размер значения DWORD .
Это значение обрабатывается как логическое значение с 0, которое используется для обозначения FALSE (отключено), а ненулевое значение — значение TRUE (включено).
-
optlen [in]
-
Размер буфера optval (в байтах). Этот размер должен быть равен или больше размера значения DWORD .
Возвращаемое значение
Если операция завершается успешно, функция setsockopt возвращает ноль.
Если операция завершается сбоем, возвращается значение SOCKET_ERROR и можно получить определенный код ошибки, вызвав WSAGetLastError.
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup . |
|
Произошел сбой сетевой подсистемы. |
|
Один из параметров optval или optlen указывает на память, которая не находится в допустимой части адресного пространства пользователя. Эта ошибка также возвращается, если значение, указываемое параметром optlen , меньше размера значения DWORD . |
|
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. |
|
Параметр level неизвестен или недопустим. В Windows Vista и более поздних версиях эта ошибка также возвращается, если сокет находился в переходном состоянии. |
|
Параметр неизвестен или не поддерживается указанным семейством протоколов. Эта ошибка возвращается, если дескриптор сокета, переданный в параметре s , был для сокета датаграммы. |
|
Дескриптор не является сокетом. |
Комментарии
Функция getsockopt , вызываемая с параметром сокета SO_KEEPALIVE , позволяет приложению получить текущее состояние параметра keepalive, хотя эта функция обычно не используется. Если приложению необходимо включить сохранение пакетов в сокете, оно просто вызывает функцию setsockopt , чтобы включить параметр .
Функция setsockopt , вызываемая с параметром сокета SO_KEEPALIVE , позволяет приложению поддерживать работоспособность пакетов для подключения к сокету. Параметр SO_KEEPALIVE для сокета по умолчанию отключен (имеет значение FALSE).
Если этот параметр сокета включен, стек TCP отправляет пакеты, поддерживающие работоспособность, если данные или пакеты подтверждения не были получены для подключения в течение интервала. Дополнительные сведения о параметре поддержания активности см. в разделе 4.2.3.6 в разделе Требования к узлам Интернета — уровни связи , указанные в RFC 1122, доступные на веб-сайте IETF. (Этот ресурс может быть доступен только на английском языке.)
Параметр сокета SO_KEEPALIVE действителен только для протоколов, поддерживающих понятие keep-alive (протоколы, ориентированные на подключение). Для TCP время ожидания по умолчанию составляет 2 часа, а интервал поддержания активности — 1 секунда. Количество проб поддержания активности по умолчанию зависит от версии Windows.
Код элемента управления SIO_KEEPALIVE_VALS можно использовать для включения или отключения режима поддержания активности, а также настройки времени ожидания и интервала для одного подключения. Если параметр Keep-Alive включен с SO_KEEPALIVE, параметры TCP по умолчанию используются для времени ожидания и интервала поддержания активности, если эти значения не были изменены с помощью SIO_KEEPALIVE_VALS.
Значение времени ожидания активности по умолчанию для всей системы контролируется с помощью параметра реестра KeepAliveTime , который принимает значение в миллисекундах. Общесистемное значение интервала поддержания активности по умолчанию контролируется с помощью параметра реестра KeepAliveInterval , который принимает значение в миллисекундах.
В Windows Vista и более поздних версиях количество проб поддержания активности (повторной передачи данных) равно 10 и не может быть изменено.
В Windows Server 2003, Windows XP и Windows 2000 значение по умолчанию для количества проб поддержания активности равно 5. Количество проб поддержания активности можно контролировать с помощью параметров реестра TcpMaxDataRetransmissions и PPTPTcpMaxDataRetransmissions . Для количества проб поддержания активности задается большее из двух значений разделов реестра. Если это число равно 0, пробы поддержания активности не будут отправляться. Если это число превышает 255, оно корректируется до 255.
В Windows Vista и более поздних версиях параметр сокета SO_KEEPALIVE можно задать только с помощью функции setockopt , если сокет находится в известном состоянии, а не в переходном состоянии. Для TCP параметр сокета SO_KEEPALIVE следует задать либо перед вызовом функции connect (connect, ConnectEx, WSAConnect, WSAConnectByList или WSAConnectByName), либо после фактического завершения запроса на подключение. Если функция connect была вызвана асинхронно, для этого необходимо дождаться завершения подключения, прежде чем пытаться задать параметр сокета SO_KEEPALIVE . Если приложение попытается задать параметр сокета SO_KEEPALIVE , когда запрос на подключение все еще находится в процессе, функция setockopt завершится ошибкой и вернет WSAEINVAL.
В Windows Server 2003, Windows XP и Windows 2000 параметр сокета SO_KEEPALIVE можно задать с помощью функции setockopt , когда сокет является переходным состоянием (запрос на подключение все еще выполняется), а также известным состоянием.
Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента |
Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера |
Windows 2000 Server [только классические приложения] |
Заголовок |
|