- SOKEEPALIVE — опция сокета для поддержки активного соединения
- Описание функции KEEPALIVE
- Syntax
- Настройка KEEPALIVE в Windows 9598ME
- Синтаксис:
- cbInBuffer
- lpvInBuffer
- Описание
- Значения параметров
- Использование
- Пример использования
- Заключение
- Socket option value
- Параметры
- Описание
- Remarks
- Видео:
- Безопасность цепочки поставки Open Source-компонентов / Алексей Смирнов (profiscope.io)
SOKEEPALIVE — опция сокета для поддержки активного соединения
SOKEEPALIVE — это опция сокета, которая предназначена для поддержания активного соединения между клиентом и сервером. С помощью этой опции сокет может автоматически проверять состояние соединения и переустанавливать его в случае обнаружения возникновения проблем.
Описание этой опции сокета может варьироваться в зависимости от операционной системы. В Windows эта опция называется SO_KEEPALIVE, а в Linux ее можно настроить с помощью команды sysctl. С помощью настройки SOKEEPALIVE клиент и сервер могут определить активность соединения и принять меры по его поддержанию.
Опция SOKEEPALIVE позволяет задать время ожидания перед выполнением проверки состояния соединения. Это время указывается в миллисекундах и определяет интервал между проверками состояния соединения. Если в течение этого времени не будет получен ответ от другой стороны, то соединение будет считаться неактивным.
Когда активность соединения не подтверждается после определенного числа проверок, то сокет выполнит действия, указанные в настройках опции. Так, настройка SOKEEPALIVE может определять количество пакетов, отправляемых для проверки состояния соединения, а также другие параметры, влияющие на его поведение.
Настройка опции SOKEEPALIVE может быть особенно полезна, когда соединение устанавливается через протокол TCP или PPTP, где необходимо обнаружить и восстановить активность соединения. Это позволяет избежать проблем с разрывами связи и продолжить пересылку данных без потерь и задержек.
Описание функции KEEPALIVE
Данная функция, also known as SO_KEEPALIVE, применяется для создания и сохранения активного соединения между клиентом и сервером. Она обнаруживает разрыв соединения и в случае его обнаружения автоматически переустанавливает соединение без участия потребителя.
Функция KEEPALIVE применима для сокетов, работающих в режиме TCP или управляющих соединениями, основанными на протоколе TCP. Для установления параметров KEEPALIVE необходимо использовать функцию ioctlsocket().
Значение параметра keep-alive представлено переменной DWORD в виде 0 или 1:
- Если значение равно 1, то функция KEEPALIVE включается и будет применяться к соединениям этого сокета.
- Если значение равно 0, то функция KEEPALIVE выключается и не будет применяться к соединениям этого сокета.
KEEPALIVE вводится через флаг SO_KEEPALIVE с помощью функции setsockopt(). В случае успеха эта функция возвращает 0, иначе возвращается код ошибки socket_error, и описатель ошибки определяет вид ошибки.
Значение keepalive_interval указывает временной интервал, в миллисекундах, между двумя последовательными проверками активности сокета.
Значение keepalive_interval должно быть больше нуля. Если значение keepalive_interval равно нулю, то оно будет установлено в значение по умолчанию, которое составляет 2 часа в Windows 2000, NT, XP и более поздних версиях. В Windows 95/98/Me значение по умолчанию составляет 2 часа.
KEEPALIVE также предоставляет параметр keepalive_time для контроля количества проверок keepalive, выполняемых после того, как соединение перешло в состояние keep-alive.
Параметр pptptcpmaxdataretransmissions устанавливает максимальное число повторных передач TCP в случае потери данных.
Для передачи параметров KEEPALIVE структура sio_keepalive содержит значения параметров:
- onoff — позволяет включить или отключить режим keep-alive.
- keepalive_interval — устанавливает временной интервал для проверки активности сокета.
- keepalive_time — устанавливает количество проверок keepalive после перехода соединения в состояние keep-alive.
Значение для параметра keepalive_interval должно быть в диапазоне от 1 до 65535 миллисекунд. Значение keepalive_time должно быть в диапазоне от 1 до 65535.
KEEPALIVE применима только к послойным интерфейсам сетевого стека в Windows. Она не управляет поведением последующих сетевых протоколов и не влияет на трафик в Интернете или контролируемые протоколы датаграмм. Также параметры KEEPALIVE не могут быть контролируемыми для сокетов датаграмм.
Для получения информации о состоянии KEEPALIVE, а также установки параметров, воспользуйтесь функцией WSAIoctl(). Переменная lpvoutbuffer содержит указатель на буфер, содержащий результаты функции.
Помните, что неконтролируемое использование KEEPALIVE может привести к нежелательным проблемам, таким как увеличение объема трафика или последующая нестабильность соединения. Поэтому рекомендуется внимательно настраивать параметры KEEPALIVE для оптимальной работы.
Syntax
Для использования опции keep-alive в сокетах необходимо знать синтаксис для ее включения и настройки. Ниже описаны параметры и синтаксис, которые могут быть использованы при работе с keep-alive.
Для включения и настройки keep-alive опции сокета используются следующие параметры:
socket(int domain, int type, int protocol)
Принимает домен, тип и протокол сокета и возвращает дескриптор нового сокета. Домен может быть интернет или UNIX-доменом, тип — потоковым или дейтаграммным.
setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen)
Устанавливает опции сокета. Флаги могут быть использованы для включения или отключения опций, а параметры — для настройки параметров опции.
getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)
Возвращает значение опции сокета. Флаги могут быть использованы для получения определенных параметров опции.
cboutbuffer
Указатель на буфер для отправки данных. Это может быть сообщение, команда или другая информация, которую вы хотите отправить на сервер или получить с сервера.
cbinbuffer
Указатель на буфер для получения данных. Это может быть сообщение, ответ сервера или другая информация, которую вы хотите получить с сервера.
lpvoutbuffer
lpcompletionroutine
Указатель на функцию обратного вызова, которая будет вызываться после записи или чтения данных.
lpthreadid
Указатель на идентификатор потока продолжения. Этот параметр используется для контроля работы сокета в многопоточной среде.
dwiocontrolcode
Используется для отправки команды сокету. Это может быть команда подключения, отключения или другая системная команда для управления сокетом.
dwbytesreturned
Возвращает количество байт, записанных или прочитанных из сокета.
wsathreadid
Идентификатор потока продолжения, в котором была выполнена операция сокета.
onoff
Флаг, который указывает, включена ли опция keep-alive или отключена.
lpvkkeepalivetime
Указатель на количество миллисекунд, через которое будет отправлено следующее keep-alive сообщение.
lpvkkeepaliveinterval
Указатель на количество миллисекунд, через которое keep-alive сообщения будут отправляться, если не получен ответ.
lpvkonoff
Указатель на флаг, указывающий, включена ли опция keep-alive или отключена.
Обратите внимание, что все эти параметры имеют определенный синтаксис и значения, которые необходимо указать при использовании опции keep-alive. Кроме того, помните, что использование keep-alive-сокетов может иметь системные ограничения и зависеть от настроек операционной системы и сети.
Описание синтаксиса и параметров keep-alive в различных операционных системах:
Windows:
Для включения keep-alive сокетов в Windows используется функция setsockopt
с параметром dwiocontrolcode
равным tcp_keepalive
. Значение параметра onoff
установлено на TRUE
, чтобы включить keep-alive, и на FALSE
, чтобы отключить его.
Linux:
Для включения keep-alive сокетов в Linux необходимо установить значение параметра TCP_KEEPIDLE
с помощью вызова функции setsockopt
. Это значение определяет интервал времени в секундах, после которого keep-alive сообщение будет отправлено, если на сокете не происходит никакой активности. Также можно установить другие параметры, такие как TCP_KEEPINTVL
и TCP_KEEPCNT
, чтобы настроить интервал между отправками keep-alive сообщений и максимальное количество неотвеченных keep-alive пакетов.
Mac OS:
Mac OS использует аналогичный синтаксис для Linux, но обозначает параметры как TCP_KEEPALIVE
, TCP_KEEPINTVL
и TCP_KEEPCNT
.
Interbase:
Interbase, база данных, используемая в приложениях на разных платформах, также поддерживает настройку keep-alive сокетов. Настройки параметров keep-alive можно найти в разделе настроек сервера или клиентской программы.
Firebird:
Firebird, другая база данных, также имеет возможность настройки keep-alive сокетов. В настройках сервера и клиентских программ можно указать интервалы и параметры для keep-alive сообщений.
Vista:
В операционной системе Vista и более новых версиях Windows параметры keep-alive можно настроить с помощью системного реестра или групповой политики.
Keep-alive может быть использован для предотвращения зависания клиентских соединений и обеспечения активного подключения между клиентом и сервером. Он также может быть полезен для отслеживания активности на вашем веб-сайте и уведомления, если клиенты не отправляют запросы в течение заданного интервала времени.
Настройка KEEPALIVE в Windows 9598ME
Настройка опции KEEPALIVE в операционных системах Windows 95/98/ME позволяет поддерживать активное соединение между клиентом и сервером. Эта опция позволяет определить время простоя соединения, после которого сокет будет считаться отключенным.
Для включения опции KEEPALIVE в Windows 95/98/ME используется функция setsockopt(). Эта функция позволяет установить указанное время простоя и интервал проверки состояния сокета. Синтаксис функции следующий:
Синтаксис:
int setsockopt(int s, int level, int optname, const char* optval, int optlen);
Где:
- s — дескриптор сокета;
- level — уровень опции; в данном случае для установки опции KEEPALIVE используется значение SOL_SOCKET;
- optname — имя опции; в данном случае используется значение SO_KEEPALIVE;
- optval — указатель на буфер с данными опции; в данном случае можно указать значение TRUE или FALSE для включения или отключения опции KEEPALIVE;
- optlen — размер буфера с данными опции.
Параметры опции KEEPALIVE в Windows 95/98/ME могут быть установлены с помощью функции setsockopt() до окончания установки соединения или в любой момент времени позже. Однако, при установке опции KEEPALIVE на уже установленном сокете, семейство и тип сокета должны соответствовать значениям, указанным при его создании.
Опция KEEPALIVE имеет следующие параметры:
- optval — указатель на буфер с данными опции. Если флаг TRUE передан, то опция включается, а если флаг FALSE — то отключается;
- optlen — размер буфера с данными опции.
Значение опции KEEPALIVE будет отличаться для каждой системы, поэтому рекомендуется ознакомиться с документацией системы. В Windows 95/98/ME значение по умолчанию составляет 2 часа таймера «keep-alive».
Задержка определения состояния сокета KEEPALIVE определяется с помощью опции TCP_KEEPALIVE_INTERVAL и указывается в миллисекундах. По умолчанию значение этой опции составляет 1 миллисекунду.
Чтобы включить опцию KEEPALIVE на сервере, установите флаг SO_KEEPALIVE на сокете сервера до его подключения к сети. Если опция KEEPALIVE включена на сервере, сокеты клиентов автоматически настроены для работы с этой опцией. Если опция KEEPALIVE выключена на сервере, то сокет клиента также будет настроен с выключенной опцией. Значение опции KEEPALIVE для клиентов может быть изменено с помощью функции setsockopt.
Примечание: функция setsockopt() возвращает значение 0 в случае успешного выполнения или значение SOCKET_ERROR в случае ошибки. Для получения информации об ошибке можно воспользоваться функцией WSAGetLastError().
cbInBuffer
Параметр cbInBuffer (указатель на переменную типа DWORD) представляет собой выходной параметр, содержащий размер входного буфера для функции getsockopt. Этот размер указывает, сколько байтов может быть прочитано из буфера. Значение этого параметра должно быть равно размеру буфера, на который указывает lpvInBuffer.
lpvInBuffer
Описание
SO_KEEPALIVE — это опция сокета, которая разрешает отправку периодических keep-alive пакетов через активное соединение. Когда эта опция включена на стороне клиента и на сервере, она помогает поддерживать активное соединение, даже если канал связи между клиентом и сервером находится в неактивном состоянии. Такие пакеты могут быть использованы для определения состояния соединения и для обнаружения его разрыва, а также для предотвращения автоматического отключения сокета на стороне клиента платформой операционной системы.
Значения параметров
В параметре lpvInBuffer должен быть передан указатель на объект типа struct tcp_keepalive. Структура tcp_keepalive содержит следующие поля:
- u_long onoff — флаг, который устанавливает включено или отключено использование опции SO_KEEPALIVE. Значение 1 включает опцию, а значение 0 выключает.
- u_long keepalivetime — интервал времени в миллисекундах между отправкой двух последовательных keep-alive пакетов на неактивном соединении.
- u_long keepaliveinterval — интервал времени в миллисекундах между последовательными keep-alive пакетами, если ответ на предыдущий keep-alive пакет не был получен.
Использование
Параметр lpvInBuffer в функции WSAIoctl используется для установки настроек SO_KEEPALIVE сокета. Если вы хотите, чтобы соединение оставалось активным даже если клиент и сервер находятся в неактивном состоянии, установите поле onoff в 1 и задайте желаемые интервалы времени с помощью полей keepalivetime и keepaliveinterval.
Пример использования
Ниже приведен пример установки настроек SO_KEEPALIVE сокета с помощью функции WSAIoctl:
// Создание структуры tcp_keepalive с желаемыми значениями tcp_keepalive keepaliveSettings; keepaliveSettings.onoff = 1; // Включение опции SO_KEEPALIVE keepaliveSettings.keepalivetime = 60000; // Интервал в 60 секунд keepaliveSettings.keepaliveinterval = 10000; // Интервал в 10 секунд // Вызов функции WSAIoctl для установки настроек SO_KEEPALIVE int result = WSAIoctl(socket, SIO_KEEPALIVE_VALS, &keepaliveSettings, sizeof(tcp_keepalive), NULL, 0, &bytesReturned, NULL, NULL); // Проверка результата вызова функции WSAIoctl if (result != SOCKET_ERROR) { // Успешное выполнение операции } else { // Ошибка при выполнении операции int error = WSAGetLastError(); // Обработка ошибки }
В этом примере опция SO_KEEPALIVE устанавливается для переданного сокета. Интервалы времени между keep-alive пакетами заданы в значениях 60 секунд и 10 секунд соответственно.
Заключение
Параметр lpvInBuffer в функции WSAIoctl с помощью опции SO_KEEPALIVE позволяет настраивать активное соединение, используя keep-alive пакеты. Это полезно для поддержания длительных соединений между клиентом и сервером, а также для автоматического обнаружения разрывов соединения на стороне клиента.
Socket option value
Значение опции сокета
Опция сокета SO_KEEPALIVE используется для поддержки активного соединения. Значение опции устанавливается с помощью функции setsockopt и может быть задано в виде целого числа, обозначающего интервал времени в секундах.
Сокет может быть установлен в режим активного соединения, когда клиент и сервер посылают друг другу сигналы keep-alive, чтобы проверить, что соединение все еще активно. Это полезно в ситуациях, когда соединение может быть потеряно из-за проблем в сети или других факторов.
Значение опции SO_KEEPALIVE определяет, как часто будут отправляться сигналы keep-alive. Если значение опции равно 0, то сигналы keep-alive будут отключены. Если значение опции больше 0, то сигналы будут отправляться каждые указанные секунды.
В Linux значение опции SO_KEEPALIVE задается следующим образом:
int keepalive = 1;
int keepalivetime = 60;
int keepaliveinterval = 5;
setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(int));
setsockopt(socket, SOL_TCP, TCP_KEEPIDLE, &keepalivetime, sizeof(int));
setsockopt(socket, SOL_TCP, TCP_KEEPINTVL, &keepaliveinterval, sizeof(int));
Здесь keepalive равно 1, что включает опцию keep-alive на сокете. Параметр keepalivetime задает время в секундах до отправки первого сигнала keep-alive, а параметр keepaliveinterval задает интервал между последующими сигналами keep-alive.
В InterBase и Firebird Classic значение опции можно установить с помощью параметра RemoteKeepAliveInterval в файле interbase.interbase.fdb:
[MyDatabase]
Database = C:\path\to\database.fdb
RemoteKeepAliveInterval = 60
Здесь значение RemoteKeepAliveInterval равно 60, что означает, что сигналы keep-alive будут отправляться каждые 60 секунд.
Замечание: в некоторых ситуациях, при использовании активного соединения и задержками на сети, может возникнуть ситуация, когда соединение останется открытым, но данные будут блокированы из-за зависших или более сложных соединений. В такой ситуации поможет введение времени ожидания, после которого будет ошибка сокета или сообщение о тайм-ауте.
Значение опции SO_KEEPALIVE применяется только к клиентским соединениям. При использовании с опцией SO_RCVTIMEO или SO_SNDTIMEO может возникнуть ошибка сокета WSAETIMEDOUT или сообщение о тайм-ауте. При использовании с опцией setsockopt с флагом SO_LINGER может также возникнуть ошибка сокета или сообщение о тайм-ауте.
Для сокетов, связанных с датаграммами, значение опции SO_KEEPALIVE определяет, будет ли сообщение keep-alive отправляться для обнаружения завершения соединений или блокировки данных. При значении равном 0 сообщение keep-alive не будет отправляться. При значении больше 0 сообщение будет отправляться каждые указанные секунды.
В Windows значение опции SO_KEEPALIVE устанавливается с помощью функции WSAIoctl и структуры SIO_KEEPALIVE_VALS:
DWORD dwBytesReturned;
BOOL bKeepAlive = TRUE;
u_long ul = 1000; // 1000 milliseconds
WSAIoctl(socket, SIO_KEEPALIVE_VALS, &bKeepAlive, sizeof(BOOL), NULL, 0, &dwBytesReturned, NULL, NULL);
if (bKeepAlive)
{
struct tcp_keepalive ka;
ka.onoff = 1;
ka.keepalivetime = ul;
ka.keepaliveinterval = ul;
if (WSAIoctl(socket, SIO_KEEPALIVE_VALS, &ka, sizeof(struct tcp_keepalive),
NULL, 0, &dwBytesReturned, NULL, NULL) == SOCKET_ERROR)
{
// Ошибка сокета
}
}
Здесь bKeepAlive равно TRUE, что включает опцию keep-alive на сокете. Параметр ul задает время в миллисекундах до отправки первого сигнала keep-alive и интервал между последующими сигналами keep-alive.
В случае успеха функция WSAIoctl возвращает 0, иначе она возвращает SOCKET_ERROR. В этом случае можно вызвать функцию WSAGetLastError для получения кода ошибки.
Если при вызове WSAIoctl произойдет переполнение буфера или сокет станет неблокированным, будут возвращены коды ошибок WSAEFAULT и WSAEINVAL соответственно.
Если выполнение функции WSAIoctl завершилось успешно, то соединение будет активным до тех пор, пока пользовательское приложение не закроет сокет или не вызовет функцию shutdown. Если пользовательское приложение закрыло сокет, использующий keep-alive, а другое приложение все еще читает из сокета или пытается записать в него, то будет возвращено значение, указывающее на отсутствие соединения.
Значение опции SO_KEEPALIVE также может использоваться с помощью перекрытия I/O (overlapped I/O). Когда функция WSAIoctl возвращает, когда запрос завершен, и если значение параметра lpCompletionRoutine не равно NULL, то функция, определенная указанным параметром, будет вызвана, когда запрос завершится. Если значение параметра lpCompletionRoutine равно NULL, то функция WSAIoctl завершается немедленно, когда запрос завершается.
Для отключения опции SO_KEEPALIVE следует использовать значение 0 для параметра onoff.
Параметры
- socket: дескриптор сокета, для которого будет установлено значение опции SO_KEEPALIVE.
- level: параметр, определяющий уровень протокола, для которого будет установлено значение опции. Для TCP/IP протокола значение параметра должно быть равно IPPROTO_TCP.
- option_name: имя опции, для которой будет установлено значение. Значение параметра должно быть равно SO_KEEPALIVE.
- option_value: указатель на буфер, содержащий значение опции SO_KEEPALIVE.
- option_len: размер буфера, содержащего значение опции SO_KEEPALIVE.
Описание
Опция сокета SO_KEEPALIVE используется для поддержки активного соединения и может быть применена к сокетам, связанным с TCP/IP или UDP/IP протоколом. Значение опции задает интервал времени в секундах для отправки сигналов keep-alive.
Сигналы keep-alive используются для проверки активности соединения и могут быть полезны при обнаружении зависших соединений или блокировки данных.
Значение опции SO_KEEPALIVE применяется только к клиентским соединениям. При использовании с опцией SO_RCVTIMEO или SO_SNDTIMEO может возникнуть ошибка сокета WSAETIMEDOUT или сообщение о тайм-ауте. При использовании с опцией setsockopt с флагом SO_LINGER может также возникнуть ошибка сокета или сообщение о тайм-ауте.
Для сокетов, связанных с датаграммами, значение опции SO_KEEPALIVE определяет, будет ли сообщение keep-alive отправляться для обнаружения завершения соединений или блокировки данных. При значении равном 0 сообщение keep-alive не будет отправляться. При значении больше 0 сообщение будет отправляться каждые указанные секунды.
Remarks
Опция SOKEEPALIVE позволяет поддерживать активное соединение на уровне сокета. Она обеспечивает отправку period на удаленный компьютер каждые и amount секунд, чтобы поддерживать связь активной даже при отсутствии передачи данных.
Для активации опции SOKEEPALIVE необходимо использовать функцию ioctlsocket, указав параметр dwIoControlCode равным SIO_KEEPALIVE_VALS. В качестве третьего и четвертого параметров функции необходимо указать указатель на структуру SIO_KEEPALIVE_VALS, которая представляет собой следующую структуру:
Поле | Тип | Описание |
---|---|---|
onoff | BOOL | Указывает, включена ли опция SOKEEPALIVE |
keepalivetime | ULONG | Время в миллисекундах между двумя последовательными пробами keep-alive |
keepaliveinterval | ULONG | Время в миллисекундах между двумя последовательными пробами keep-alive, если не получен ответ на последний запрос keep-alive |
Опция SOKEEPALIVE работает только в сокетах TCP. Для сокетов UDP следует использовать опцию SO_BROADCAST.
В случае успешного выполнения функции ioctlsocket с флагом SIO_KEEPALIVE_VALS, эта опция будет применена ко всем клиентским коннектам данного сокета.
Remarks:
- Эта опция не применяется к коннектам, установленным ранее. Она применяется только к новым коннектам, установленным после выполнения ioctlsocket.
- Опция SOKEEPALIVE не применяется в Linux и Windows 95/98/ME. В этих ОС рекомендуется использовать другие средства настройки keep-alive.
- Если параметр onoff установлен в нуль, то keep-alive выключается для соединения на уровне сокета.
- Описание настройки timeout можно найти в документации к вашей ОС.
- Пример использования:
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int main() { int sock; struct SIO_KEEPALIVE_VALS keepalive_vals; sock = socket(AF_INET, SOCK_STREAM, 0); keepalive_vals.onoff = 1; keepalive_vals.keepalivetime = 7200000; // 2 часа keepalive_vals.keepaliveinterval = 1000; setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE_VALS, (char*)&keepalive_vals, sizeof(struct SIO_KEEPALIVE_VALS)); return 0; }
Видео:
Безопасность цепочки поставки Open Source-компонентов / Алексей Смирнов (profiscope.io)
Безопасность цепочки поставки Open Source-компонентов / Алексей Смирнов (profiscope.io) by HighLoad Channel 596 views 10 months ago 55 minutes