Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Параметр сокета SO_CONDITIONAL_ACCEPT предназначен для разрешения приложения принимать ли входящее подключение в сокет прослушивания.
Значение параметра сокета
Константой, представляющей этот параметр сокета, является 0x3002.
Синтаксис
int setsockopt(
(SOCKET) s, // descriptor identifying a socket
(int) SOL_SOCKET, // level
(int) SO_CONDITIONAL_ACCEPT, // optname
(char *) optval, // input buffer,
(int) optlen, // size of input buffer
);
Параметры
-
s [in]
-
Дескриптор, определяющий сокет.
-
level [in]
-
Уровень, на котором определен параметр. Используйте SOL_SOCKET для этой операции.
-
optname [in]
-
Параметр сокета, для которого необходимо задать значение. Используйте SO_CONDITIONAL_ACCEPT для этой операции.
-
optval [out]
-
Указатель на буфер, содержащий значение для заданного параметра. Этот параметр должен указывать на буфер, равный или превышающий размер значения DWORD .
Это значение рассматривается как логическое значение с 0, используемое для указания FALSE (отключено) и ненулевого значения, указывающее TRUE (включено).
-
optlen [in, out]
-
Указатель на размер в байтах буфера optval . Этот размер должен быть равен или больше размера значения DWORD .
Возвращаемое значение
Если операция выполнена успешно, наборы окопt возвращают ноль.
Если операция завершается ошибкой, возвращается значение SOCKET_ERROR, а определенный код ошибки можно получить путем вызова WSAGetLastError.
| Код ошибки | Meaning |
|---|---|
| Перед использованием этой функции необходимо выполнить успешный вызов WSAStartup . |
|
| Сбой сетевой подсистемы. |
|
| Один из параметров optval или optlen указывает на память, которая не находится в допустимой части адресного пространства пользователя. Эта ошибка также возвращается, если значение, указываемое параметром optlen , меньше размера значения DWORD . |
|
| Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. |
|
| Параметр уровня неизвестен или недопустим. Эта ошибка также возвращается, если сокет уже был в состоянии прослушивания. |
|
| Параметр неизвестен или не поддерживается указанным семейством протоколов. |
|
| Дескриптор не является сокетом. |
Замечания
Функция setsockopt , вызываемая с параметром сокета SO_CONDITIONAL_ACCEPT , позволяет приложению решить, принимать ли входящее соединение на сокете прослушивания. Параметр условного принятия для сокета отключен (задано значение FALSE) по умолчанию.
Если этот параметр сокета включен, стек TCP не принимает подключения автоматически. Он ожидает, пока приложение примет подключение через функцию WSAAccept . После получения запроса на подключение Winsock вызывает условный обратный вызов, зарегистрированный приложением. Только если обратный вызов условного приема возвращается CF_ACCEPT Winsock уведомит транспорт полностью принять подключение.
Если параметр сокета SO_CONDITIONAL_ACCEPT включен (задано значение TRUE), это имеет несколько побочных эффектов для сокета:
- Это отключает встроенную защиту от атак SYN в стеке TCP, так как приложение теперь берет на себя ответственность за прием подключений.
- Это фактически отключает невыполненную работу прослушивания, так как подключения не принимаются от имени сокета прослушивания. Подключение никогда не принимается полностью до тех пор, пока приложение полностью не принимает его с помощью механизма CF_ACCEPT .
- Это также означает, что приложение должно всегда находиться в состоянии, чтобы легко обрабатывать обратные вызовы приема для принятия подключения. Если приложение занято выполнять другую обработку, клиентская сторона может истекть до того, как приложение фактически принимает подключение. Это приводит к плохому интерфейсу клиента.
- Некоторые оптимизации стека TCP не применяются к полностью принятым подключениям даже после завершения условного принятия. Это может снизить производительность подключения в течение всего времени существования.
Как правило, основные причины, по которым приложения используют условное принятие, — проверить исходный IP-адрес или порт, используемый клиентом подключения, а затем принять или отклонить подключение. Однако приложения, скорее всего, будут работать лучше, если параметр SO_CONDITIONAL_ACCEPT не включен, и приложение позволяет стеку TCP и невыполненной работе прослушивания. Затем, когда приложение обрабатывает принятое подключение, если оно находится из неправильного IP-адреса или порта, приложение может просто закрыть сокет. Недостаток безопасности в этом поведении заключается в том, что теперь клиент имеет подтверждение того, что приложение прослушивает IP-адрес и порт, так как оно принудительно закрыло ранее принятое подключение. Однако недостатки включения SO_CONDITIONAL_ACCEPT , как правило, перевешивают это ограничение.
Функция getsockopt , вызываемая с параметром сокета SO_CONDITIONAL_ACCEPT , позволяет приложению получить текущее состояние условного приема, хотя эта функция обычно не используется. Если приложению необходимо включить условное принятие в сокете, он просто вызывает функцию setsockopt , чтобы включить этот параметр.
Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.
Требования
| Требование | Ценность |
|---|---|
| Минимальный поддерживаемый клиент |
Windows Vista [только классические приложения] |
| Минимальный поддерживаемый сервер |
Windows Server 2008 [только классические приложения] |
| Header |
|
См. также