Поделиться через


Код элемента управления SIO_LOOPBACK_FAST_PATH

Описание

Код элемента управления SIO_LOOPBACK_FAST_PATH настраивает сокет TCP для меньшей задержки и ускорения операций в интерфейсе замыкания на себя.

ВажноSIO_LOOPBACK_FAST_PATH не рекомендуется использовать в коде.

Для выполнения этой операции вызовите функцию WSAIoctl или WSPIoctl со следующими параметрами.

int WSAIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_LOOPBACK_FAST_PATH,                // dwIoControlCode
  (LPVOID) lpvInBuffer,   // pointer to a Boolean value
  (DWORD) cbInBuffer,    // size, in bytes, of the input buffer
  (LPVOID) lpvOutBuffer,         // pointer to output buffer
  (DWORD) cbOutBuffer,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_LOOPBACK_FAST_PATH,                // dwIoControlCode
  (LPVOID) lpvInBuffer,   // pointer to a Boolean value
  (DWORD) cbInBuffer,           // size, in bytes, of the input buffer
  (LPVOID) lpvOutBuffer,         // pointer to output buffer
  (DWORD) cbOutBuffer,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Параметры

s

Дескриптор, определяющий сокет.

dwIoControlCode

Код элемента управления для операции. Для этой операции используйте SIO_LOOPBACK_FAST_PATH .

lpvInBuffer

Указатель на входной буфер. Этот параметр содержит указатель на логическое значение, указывающее, следует ли настроить сокет для быстрых операций замыкания на себя.

cbInBuffer

Размер входного буфера (в байтах).

lpvOutBuffer

Указатель на выходной буфер. Этот параметр не используется для этой операции.

cbOutBuffer

Размер выходного буфера (в байтах). Этот параметр должен иметь нулевое значение.

lpcbBytesReturned

Указатель на переменную, которая получает размер данных в байтах, хранящихся в выходном буфере.

Если выходной буфер слишком мал, вызов завершается ошибкой, WSAGetLastError возвращает WSAEINVAL, а параметр lpcbBytesReturned указывает на значение DWORD , равное нулю.

Если lpOverlapped имеет значение NULL, значение DWORD , на которое указывает параметр lpcbBytesReturned , возвращаемое при успешном вызове, не может быть равным нулю.

Если параметр lpOverlapped не имеет значения NULL для перекрывающихся сокетов, операции, которые не могут быть завершены немедленно, будут инициированы, а завершение будет указано позже. Значение DWORD , на которое указывает возвращаемый параметр lpcbBytesReturned , может быть равным нулю, так как размер хранимых данных не может быть определен до завершения перекрывающейся операции. Окончательное состояние завершения можно получить, когда соответствующий метод завершения получает сигнал о завершении операции.

lpvOverlapped

Указатель на структуру WSAOVERLAPPED .

Если сокеты были созданы без перекрывающихся атрибутов, параметр lpOverlapped игнорируется.

Если объект был открыт с перекрывающимся атрибутом, а параметр lpOverlapped не имеет значения NULL, операция выполняется как перекрываемая (асинхронная) операция. В этом случае параметр lpOverlapped должен указывать на допустимую структуру WSAOVERLAPPED .

Для перекрывающихся операций функция WSAIoctl или WSPIoctl возвращается немедленно, а соответствующий метод завершения получает сигнал о завершении операции. В противном случае функция не возвращается, пока операция не будет завершена или не возникнет ошибка.

lpCompletionRoutine

Тип: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Указатель на подпрограмму завершения, вызываемую при завершении операции (игнорируется для неперекрывающихся сокетов).

lpThreadId

Указатель на структуру WSATHREADID , которая будет использоваться поставщиком при последующем вызове WPUQueueApc. Поставщик должен хранить указанную структуру WSATHREADID (а не указатель на нее) до тех пор, пока не будет возвращена функция WPUQueueApc .

Примечание Этот параметр применяется только к функции WSPIoctl .

lpErrno

Указатель на код ошибки.

Примечание Этот параметр применяется только к функции WSPIoctl .

Возвращаемое значение

Если операция завершается успешно, функция WSAIoctl или WSPIoctl возвращает ноль.

Если операция завершается сбоем или находится в состоянии ожидания, функция WSAIoctl или WSPIoctl возвращает SOCKET_ERROR. Чтобы получить расширенные сведения об ошибке, вызовите WSAGetLastError.

Код ошибки Значение
WSA_IO_PENDING Выполняется перекрываемая операция ввода-вывода. Это значение возвращается, если перекрываемая операция была успешно инициирована, а завершение будет указано позже.
WSA_OPERATION_ABORTED Операция ввода-вывода прекращена из-за выхода из потока или запроса приложения. Эта ошибка возвращается, если перекрываемая операция была отменена из-за закрытия сокета или выполнения команды IOCTL SIO_FLUSH .
WSAEACCES Предпринята попытка получить доступ к сокету способом, запрещенным его разрешениями на доступ. Эта ошибка возвращается при нескольких условиях для постоянных резервирований портов, которые включают следующее: у пользователя отсутствуют необходимые права администратора на локальном компьютере или приложение не выполняется в расширенной оболочке в качестве встроенного администратора (RunAs administrator).
WSAEFAULT Система обнаружила недопустимый адрес указателя при попытке использовать аргумент указателя в вызове. Эта ошибка возвращается из параметра lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped или lpCompletionRoutine не полностью содержится в допустимой части адресного пространства пользователя.
WSAEINPROGRESS В данный момент выполняется блокирующая операция. Эта ошибка возвращается, если функция вызывается при выполнении обратного вызова.
WSAEINTR Операция блокировки была прервана вызовом WSACancelBlockingCall. Эта ошибка возвращается, если операция блокировки была прервана.
WSAEINVAL Указан недопустимый аргумент. Эта ошибка возвращается, если параметр dwIoControlCode не является допустимой командой, если указанный входной параметр недопустим или команда не применима к указанному типу сокета.
WSAENETDOWN Операция на сокете обнаружила отключение сети. Эта ошибка возвращается в случае сбоя сетевой подсистемы.
WSAENOTSOCK Предпринята попытка выполнить операцию с тем, что не является сокетом. Эта ошибка возвращается, если дескриптор не является сокетом.
WSAEOPNOTSUPP Предпринятая операция не поддерживается для типа объекта, на который указывает ссылка. Эта ошибка возвращается, если указанная команда IOCTL не поддерживается. Эта ошибка также возвращается, если поставщик транспорта не поддерживает SIO_LOOPBACK_FAST_PATH IOCTL.

Комментарии

Приложение может использовать SIO_LOOPBACK_FAST_PATH IOCTL, чтобы уменьшить задержку и повысить производительность операций замыкания на себя в сокете TCP. Этот IOCTL запрашивает, чтобы стек TCP/IP использовал специальный быстрый путь для операций замыкания на себя в этом сокете. SIO_LOOPBACK_FAST_PATH IOCTL можно использовать только с сокетами TCP. Этот IOCTL должен использоваться на обеих сторонах сеанса замыкания на себя. Быстрый путь tcp-замыкания на себя поддерживается с помощью интерфейса замыкания на себя IPv4 или IPv6.

Сокет, который планирует инициировать запрос на подключение, должен применить этот IOCTL перед выполнением запроса на подключение. Поэтому сокет, используемый функцией connect, ConnectEx, WSAConnect, WSAConnectByList или WSAConnectByName для инициации соединения, должен применять этот IOCTL для использования быстрого пути для операций замыкания на себя.

Сокет, прослушивающий запрос на подключение, должен применить этот IOCTL перед принятием подключения. Поэтому сокет, используемый функцией прослушивания, должен применять этот IOCTL, чтобы все принимаемые сокеты использовали быстрый путь для замыкания на себя. Все сокеты, возвращаемые функцией прослушивания и передаваемые функции accept, AcceptEx или WSAAccept , будут помечены для использования специального быстрого пути для операций замыкания на себя.

После того как приложение установит подключение к интерфейсу замыкания на себя с помощью быстрого пути, все пакеты на протяжении всего времени существования подключения должны использовать быстрый путь.

Применение SIO_LOOPBACK_FAST_PATH к сокету, который будет подключен к пути без замыкания на себя, не будет иметь никакого эффекта.

Эта оптимизация замыкания на себя TCP приводит к тому, что пакеты проходят через транспортный уровень (TL) вместо традиционного замыкания на себя через сетевой уровень. Такая оптимизация повышает задержку пакетов замыкания на себя. Когда приложение согласится на использование параметра уровня подключения для использования быстрого пути замыкания на себя, все пакеты будут следовать пути замыкания на себя. Для взаимодействия с замыканиями на себя перегрузка и удаление пакетов не ожидаются. Понятие контроля перегрузки и надежной доставки в TCP будет ненужным. Однако это не относится к управлению потоком. Без управления потоком отправитель может перегрузить буфер получения, что приведет к ошибочному поведению замыкания на себя tcp. Управление потоком в пути замыкания на себя, оптимизированном для TCP, поддерживается путем размещения запросов отправки в очереди. При заполнении буфера приема стек TCP/IP гарантирует, что отправка не будет завершена до тех пор, пока очередь не будет обслуживаться, поддерживая управление потоком.

Подключения с быстрым путем замыкания на себя tcp при наличии выноски платформы фильтрации Windows (WFP) для данных подключения должны принимать неоптимизованный медленный путь для замыкания на себя. Таким образом, фильтры ВПП не позволят использовать этот новый быстрый путь замыкания на себя. Если включен фильтр ВПП, система будет использовать медленный путь, даже если был задан SIO_LOOPBACK_FAST_PATH IOCTL. Это гарантирует, что приложения в пользовательском режиме обладают всеми возможностями безопасности ВПП.

По умолчанию SIO_LOOPBACK_FAST_PATH отключена.

Если для включения быстрого пути замыкания на себя в сокете используется SIO_LOOPBACK_FAST_PATH IOCTL, поддерживается только подмножество параметров сокета TCP/IP. Список поддерживаемых параметров включает следующие:

  • IP_TTL
  • IP_UNICAST_IF
  • IPV6_UNICAST_HOPS
  • IPV6_UNICAST_IF
  • IPV6_V6ONLY
  • SO_CONDITIONAL_ACCEPT
  • SO_EXCLUSIVEADDRUSE
  • SO_PORT_SCALABILITY
  • SO_RCVBUF
  • SO_REUSEADDR
  • TCP_BSDURGENT

См. также раздел

Параметры сокета IPPROTO_IP

Параметры сокета IPPROTO_IPV6

Параметры сокета IPPROTO_TCP

Сокета

Параметры сокета SOL_SOCKET

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW