код элемента управления SIO_IDEAL_SEND_BACKLOG_QUERY
Описание:
Код элемента управления SIO_IDEAL_SEND_BACKLOG_QUERY получает идеальное значение невыполненной работы (ISB) для базового подключения.
Чтобы выполнить эту операцию, вызовите функцию WSAIoctl или WSPIoctl со следующими параметрами.
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
(LPVOID) lpvOutBuffer, // 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_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
(LPVOID) lpvOutBuffer, // 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_IDEAL_SEND_BACKLOG_QUERY для этой операции.
lpvInBuffer
Указатель на входной буфер. Этот параметр не используется для этой операции.
cbInBuffer
Размер входного буфера в байтах. Этот параметр не используется для этой операции.
lpvOutBuffer
Указатель на выходной буфер. Этот параметр должен указывать на тип данных ULONG , если параметры lpOverlapped и lpCompletionRoutine имеют значение NULL.
cbOutBuffer
Размер выходного буфера в байтах. Этот параметр должен иметь по крайней мере размер типа данных ULONG .
lpcbBytesReturned
Указатель на переменную, которая получает размер (в байтах) данных, хранящихся в выходном буфере.
Если выходной буфер слишком мал, вызов завершается ошибкой, WSAGetLastError возвращает WSAEINVAL, а параметр lpcbBytesReturned указывает на значение DWORD , равное нулю.
Если значение lpOverlapped равно NULL, значение DWORD , указываемое параметром lpcbBytesReturned , возвращаемым при успешном вызове, не может быть нулевым.
Если параметр lpOverlapped не равен NULL для перекрывающихся сокетов, операции, которые не могут быть выполнены немедленно, будут инициированы, а завершение будет указано позже. Значение DWORD , на которое указывает возвращаемый параметр lpcbBytesReturned , может быть равно нулю, так как размер хранимых данных не может быть определен до завершения перекрывающейся операции. Окончательное состояние завершения можно получить, когда соответствующий метод завершения сигнализирует после завершения операции.
lpvOverlapped
Указатель на структуру WSAOVERLAPPED .
Если сокет был создан без перекрывающихся атрибутов, параметр lpOverlapped игнорируется.
Если s был открыт с перекрывающимся атрибутом, а параметр 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 . |
WSAEFAULT | Параметр lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped или lpCompletionRoutine не полностью содержится в допустимой части адресного пространства пользователя. |
WSAEINPROGRESS | Функция вызывается при выполнении обратного вызова. |
WSAEINTR | Операция блокировки была прервана. |
WSAEINVAL | Параметр dwIoControlCode не является допустимой командой или заданным входным параметром является недопустимым, или команда неприменима к указанному типу сокета. Эта ошибка возвращается, если параметр cbOutBuffer меньше размера типа данных ULONG . |
WSAENETDOWN | Сбой сетевой подсистемы. |
WSAENOPROTOOPT | Параметр сокета не поддерживается в указанном протоколе. |
WSAENOTCONN | Сокет не подключен. |
WSAENOTSOCK | Дескриптор не является сокетом. |
WSAEOPNOTSUPP | Указанная команда IOCTL не поддерживается. Эта ошибка возвращается, если SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL не поддерживается поставщиком транспорта. Эта ошибка также возвращается при попытке использовать SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL в сокете датаграммы. |
Remarks
IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY поддерживается в Windows Server 2008, Windows Vista с пакетом обновления 1 (SP1) и более поздними версиями операционной системы.
При отправке данных через TCP-подключение с помощью сокетов Windows важно сохранить достаточный объем незавершенных данных (отправленных, но еще не подтвержденных) в TCP для достижения максимальной пропускной способности. Идеальное значение объема данных, выдающегося для достижения оптимальной пропускной способности для TCP-подключения, называется идеальным размером невыполненной работы по отправке (ISB). Значение ISB — это функция продукта задержки пропускной способности TCP-подключения и объявленного окна получения приемника (отчасти количество перегрузки в сети).
Значение ISB для каждого подключения доступно из реализации протокола TCP в Windows Server 2008, Windows Vista с пакетом обновления 1 (SP1) и более поздних версий операционной системы. SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL можно использовать приложением для получения уведомления о динамическом изменении значения ISB для подключения.
На Windows Server 2008 Windows Vista с пакетом обновления 1 (SP1) и более поздних версий операционной системы SIO_IDEAL_SEND_BACKLOG_CHANGE и SIO_IDEAL_SEND_BACKLOG_QUERY ioCTLs поддерживаются в сокетах, ориентированных на поток, которые находятся в подключенном состоянии.
Диапазон для значения ISB для TCP-подключения теоретически может варьироваться от 0 до максимум 16 мегабайт.
Типичное использование SIO_IDEAL_SEND_BACKLOG_CHANGE и SIO_IDEAL_SEND_BACKLOG_QUERY ioCTLs основано на методе отправки, используемом приложениями. Рассматриваются два распространенных случая.
Приложения, выполняющие один блокирующий или неблокирующий запрос отправки за раз, обычно полагаются на внутреннюю буферизацию отправки Winsock для достижения достойной пропускной способности. Ограничение буфера отправки для заданного подключения управляется параметром сокета SO_SNDBUF . Для метода отправки с блокировкой и без блокировки ограничение буфера отправки определяет, сколько данных хранится в TCP. Если значение ISB для подключения больше предела буфера отправки, то пропускная способность, достигнутая при подключении, не будет оптимальной. Чтобы повысить пропускную способность, приложения могут задать ограничение буфера отправки на основе результата запроса ISB, так как уведомления об изменениях ISB происходят в соединении.
Для приложений, использующих перекрывающийся метод отправки с несколькими незавершенными запросами на отправку, объем данных, хранимых в TCP, определяется ограничением буфера отправки в Winsock и общим объемом данных, содержащихся в невыполненных перекрывающихся запросах на отправку. В этом случае приложения должны использовать значение ISB, чтобы определить количество невыполненных запросов на отправку и размер данных для каждого запроса на отправку. В идеале приложение должно попытаться выполнить следующее уравнение:
ISB value == send buffer limit + (number of simultaneous overlapped send requests * data length per send request)
Обратите внимание, что использование ioCTLs ISB через сокеты TCP в приведенном выше режиме может привести к увеличению использования памяти в обмен на увеличение пропускной способности подключений с высокой задержкой пропускной способности продукта. Реализация TCP в Windows будет регулировать значения ISB по мере необходимости на основе общего использования памяти системы.
Протокол IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY разрешен только в сокете потока, который находится в подключенном состоянии. В противном случае функция WSAIoctl или WSPIoctl завершится ошибкой с WSAENOTCONN.
Любой IOCTL может блокироваться на неопределенный срок в зависимости от реализации поставщика услуг. Если приложению не удается запретить блокировку в вызове функции WSAIoctl или WSPIoctl , для операций ввода-вывода, которые, скорее всего, блокируются, рекомендуется перекрывать операции ввода-вывода.
SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL, скорее всего, не блокируется, поэтому обычно он называется синхронно с параметрами lpOverlapped и lpCompletionRoutine со значением NULL.
SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL может завершиться сбоем с WSAEINTR или WSA_OPERATION_ABORTED в следующих случаях:
Tcp-подключение корректно отсоединяется в направлении отправки. Это может произойти в результате вызова функции завершения работы с параметром SD_SEND, вызовом функции DisconnectEx или вызовом функции TransmitFile или TransmitPackets с параметром dwFlags , установленным для TF_DISCONNECT или TF_REUSE. Tcp-подключение было сброшено или прервано. Запрос отменяется диспетчером ввода-вывода.
Две встроенные функции-оболочки для этих ioCTL определяются в файле заголовка Ws2tcpip.h . Рекомендуется использовать эти встроенные функции вместо использования SIO_IDEAL_SEND_BACKLOG_CHANGE и SIO_IDEAL_SEND_BACKLOG_QUERY операций ввода-вывода напрямую.
Встроенная функция-оболочка для SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL является идеальной функциейendbacklognotify .
Встроенная функция-оболочка для SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL является идеальной функциейendbacklogquery .
Динамическая буферизация отправки для TCP была добавлена на Windows 7 и Windows Server 2008 R2. По умолчанию динамическая буферизация отправки для TCP включена, если приложение не задает параметр сокета SO_SNDBUF в сокете потока.
Использование netsh — это рекомендуемый метод для запроса или задания динамической буферизации отправки для TCP.
Текущее значение динамической буферизации отправки для TCP можно получить с помощью следующей команды:
netsh winsock show autotuning
Динамическое буферизация отправки для TCP можно отключить с помощью следующей команды:
netsh winsock set autotuning off
Динамическое буферизация отправки для TCP можно включить с помощью следующей команды:
netsh winsock set autotuning on
Хотя это не рекомендуется, динамическое буферизация отправки можно отключить из приложения, задав для следующего значения реестра нулевое значение:
HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\AFD\Parameters\DynamicSendBufferDisable
При изменении значения динамической буферизации отправки с помощью NetSh.exe или изменения значения реестра компьютер должен быть перезапущен, чтобы изменения вступили в силу.
При динамической буферизации отправки на Windows 7 и Windows Server 2008 R2 использование SIO_IDEAL_SEND_BACKLOG_CHANGE и SIO_IDEAL_SEND_BACKLOG_QUERY ioCTLs требуется только в особых обстоятельствах.