Compartir a través de


código de control de SIO_IDEAL_SEND_BACKLOG_QUERY

Descripción

El código de control SIO_IDEAL_SEND_BACKLOG_QUERY recupera el valor ideal de trabajo pendiente de envío (ISB) para la conexión subyacente.

Para realizar esta operación, llame a la función WSAIoctl o WSPIoctl con los parámetros siguientes.

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.
);

Parámetros

s

Descriptor que identifica un socket.

dwIoControlCode

Código de control para la operación. Use SIO_IDEAL_SEND_BACKLOG_QUERY para esta operación.

lpvInBuffer

Puntero al búfer de entrada. Este parámetro no se usa para esta operación.

cbInBuffer

Tamaño, en bytes, del búfer de entrada. Este parámetro no se usa para esta operación.

lpvOutBuffer

Puntero al búfer de salida. Este parámetro debe apuntar a un tipo de datos ULONG si los parámetros lpOverlapped y lpCompletionRoutine son NULL.

cbOutBuffer

Tamaño, en bytes, del búfer de salida. Este parámetro debe tener al menos el tamaño de un tipo de datos ULONG .

lpcbBytesReturned

Puntero a una variable que recibe el tamaño, en bytes, de los datos almacenados en el búfer de salida.

Si el búfer de salida es demasiado pequeño, se produce un error en la llamada, WSAGetLastError devuelve WSAEINVAL y el parámetro lpcbBytesReturned apunta a un valor DWORD de cero.

Si lpOverlapped es NULL, el valor DWORD al que apunta el parámetro lpcbBytesReturned que se devuelve en una llamada correcta no puede ser cero.

Si el parámetro lpOverlapped no es NULL para sockets superpuestos, las operaciones que no se pueden completar inmediatamente se iniciarán y la finalización se indicará más adelante. El valor DWORD al que apunta el parámetro lpcbBytesReturned devuelto puede ser cero, ya que el tamaño de los datos almacenados no se puede determinar hasta que se haya completado la operación superpuesta. El estado de finalización final se puede recuperar cuando se señala el método de finalización adecuado cuando se ha completado la operación.

lpvOverlapped

Puntero a una estructura WSAOVERLAPPED .

Si el socket se creó sin el atributo superpuesto, se omite el parámetro lpOverlapped .

Si se abrió con el atributo superpuesto y el parámetro lpOverlapped no es NULL, la operación se realiza como una operación superpuesta (asincrónica). En este caso, el parámetro lpOverlapped debe apuntar a una estructura WSAOVERLAPPED válida.

En el caso de las operaciones superpuestas, la función WSAIoctl o WSPIoctl devuelve inmediatamente y el método de finalización adecuado se señala cuando se ha completado la operación. De lo contrario, la función no devuelve hasta que se haya completado la operación o se produzca un error.

lpCompletionRoutine

Tipo: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Puntero a la rutina de finalización a la que se llama cuando se ha completado la operación (se omite para sockets no superpuestos).

lpThreadId

Puntero a una estructura WSATHREADID que va a usar el proveedor en una llamada posterior a WPUQueueApc. El proveedor debe almacenar la estructura WSATHREADID a la que se hace referencia (no el puntero a la misma) hasta que se devuelva la función WPUQueueApc .

Nota Este parámetro solo se aplica a la función WSPIoctl .

lpErrno

Puntero al código de error.

Nota Este parámetro solo se aplica a la función WSPIoctl .

Valor devuelto

Si la operación se completa correctamente, la función WSAIoctl o WSPIoctl devuelve cero.

Si se produce un error en la operación o está pendiente, la función WSAIoctl o WSPIoctl devuelve SOCKET_ERROR. Para obtener información de error extendida, llame a WSAGetLastError.

Código de error Significado
WSA_IO_PENDING Una operación superpuesta se inició correctamente y la finalización se indicará en un momento posterior.
WSA_OPERATION_ABORTED Se canceló una operación superpuesta debido al cierre del socket o a la ejecución del comando SIO_FLUSH IOCTL.
WSAEFAULT El parámetro lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped o lpCompletionRoutine no está totalmente incluido en una parte válida del espacio de direcciones del usuario.
WSAEINPROGRESS La función se invoca cuando hay una devolución de llamada en curso.
WSAEINTR Se interrumpió una operación de bloqueo.
WSAEINVAL El parámetro dwIoControlCode no es un comando válido o un parámetro de entrada especificado no es aceptable o el comando no es aplicable al tipo de socket especificado. Este error se devuelve si el parámetro cbOutBuffer es menor que el tamaño de un tipo de datos ULONG .
WSAENETDOWN Error en el subsistema de red.
WSAENOPROTOOPT La opción de socket no se admite en el protocolo especificado.
WSAENOTCONN El socket s no está conectado.
WSAENOTSOCK El descriptor s no es un socket.
WSAEOPNOTSUPP No se admite el comando IOCTL especificado. Este error se devuelve si el proveedor de transporte no admite el SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL. Este error también se devuelve cuando se intenta usar el SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL en un socket de datagrama.

Observaciones

El SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL es compatible con Windows Server 2008, Windows Vista con Service Pack 1 (SP1) y versiones posteriores del sistema operativo.

Al enviar datos a través de una conexión TCP mediante sockets de Windows, es importante mantener una cantidad suficiente de datos pendientes (enviados pero no confirmados todavía) en TCP para lograr el mayor rendimiento. El valor ideal para la cantidad de datos pendientes para lograr el mejor rendimiento para la conexión TCP se denomina tamaño ideal de trabajo pendiente de envío (ISB). El valor de ISB es una función del producto de retraso de ancho de banda de la conexión TCP y la ventana de recepción anunciada del receptor (y en parte la cantidad de congestión en la red).

El valor de ISB por conexión está disponible en la implementación del protocolo TCP en Windows Server 2008, Windows Vista con SP1 y versiones posteriores del sistema operativo. Una aplicación puede usar el SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL para obtener una notificación cuando el valor del ISB cambia dinámicamente para una conexión.

En Windows Server 2008, Windows Vista con SP1 y versiones posteriores del sistema operativo, el SIO_IDEAL_SEND_BACKLOG_CHANGE y SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs se admiten en sockets orientados a flujos que están en estado conectado.

El intervalo del valor de ISB para una conexión TCP puede variar teóricamente de 0 a un máximo de 16 megabytes.

El uso típico de los SIO_IDEAL_SEND_BACKLOG_CHANGE y SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs se basa en el método de envío utilizado por las aplicaciones. Se tratan dos casos comunes.

Las aplicaciones que realizan una solicitud de envío de bloqueo o sin bloqueo a la vez suelen basarse en el almacenamiento en búfer de envío interno mediante Winsock para lograr un rendimiento decente. El límite de búfer de envío para una conexión determinada se controla mediante la opción de socket SO_SNDBUF . Para el método de envío de bloqueo y no bloqueo, el límite del búfer de envío determina la cantidad de datos que se mantienen pendientes en TCP. Si el valor de ISB de la conexión es mayor que el límite de búfer de envío, el rendimiento obtenido en la conexión no será óptimo. Para lograr un mejor rendimiento, las aplicaciones pueden establecer el límite del búfer de envío en función del resultado de la consulta ISB a medida que se producen notificaciones de cambio de ISB en la conexión.

En el caso de las aplicaciones que usan el método de envío superpuesto con varias solicitudes de envío pendientes, la cantidad de datos pendientes en TCP viene determinada por el límite del búfer de envío en Winsock y la cantidad total de datos contenidos en las solicitudes de envío superpuestas pendientes. En este caso, las aplicaciones deben usar el valor isb para determinar cuántas solicitudes de envío pendientes deben conservar y cuál debe ser el tamaño de los datos de cada solicitud de envío. Lo ideal es que la aplicación intente mantener la siguiente ecuación satisfecho:

ISB value == send buffer limit + (number of simultaneous overlapped send requests * data length per send request)

Tenga en cuenta que el uso de las ICTL de ISB a través de sockets TCP de la manera anterior puede dar lugar a un mayor uso de memoria a cambio de un mayor rendimiento en las conexiones con un producto de retraso de ancho de banda alto. La implementación de TCP en Windows limitará los valores de ISB según sea necesario en función del uso general de la memoria del sistema.

El SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL solo se permite en un socket de flujo que esté en estado conectado. De lo contrario, se producirá un error en la función WSAIoctl o WSPIoctl con WSAENOTCONN.

Cualquier IOCTL puede bloquearse indefinidamente, en función de la implementación del proveedor de servicios. Si la aplicación no puede tolerar el bloqueo en una llamada de función WSAIoctl o WSPIoctl , se recomienda que las E/S superpuestas se bloqueen especialmente.

Es probable que el SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL no se bloquee, por lo que normalmente se denomina sincrónicamente con los parámetros lpOverlapped y lpCompletionRoutine establecidos en NULL.

El SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL puede producir un error con WSAEINTR o WSA_OPERATION_ABORTED en los casos siguientes:

La conexión TCP se desconecta correctamente en la dirección de envío. Esto puede producirse como resultado de una llamada a la función shutdown con el parámetro how establecido en SD_SEND, una llamada a la función DisconnectEx o una llamada a la función TransmitFile o TransmitPackets con el parámetro dwFlags establecido en TF_DISCONNECT o TF_REUSE. La conexión TCP se ha restablecido o anulado. El Administrador de E/S cancela la solicitud.

En el archivo de encabezado Ws2tcpip.h se definen dos funciones contenedoras insertadas para estas IOCTLs. Se recomienda usar estas funciones insertadas en lugar de usar las SIO_IDEAL_SEND_BACKLOG_CHANGE y SIO_IDEAL_SEND_BACKLOG_QUERY ICTL directamente.

La función contenedora insertada para el SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL es la función idealsendbacklognotify .

La función contenedora insertada para el SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL es la función idealsendbacklogquery .

El almacenamiento en búfer de envío dinámico para TCP se agregó en Windows 7 y Windows Server 2008 R2. De forma predeterminada, el almacenamiento en búfer de envío dinámico para TCP está habilitado a menos que una aplicación establezca la opción de socket SO_SNDBUF en el socket de secuencia.

El uso de netsh es el método recomendado para consultar o establecer el almacenamiento en búfer de envío dinámico para TCP.

El valor actual para el almacenamiento en búfer de envío dinámico para TCP se puede recuperar mediante el siguiente comando:

netsh winsock show autotuning

El almacenamiento en búfer de envío dinámico para TCP se puede deshabilitar mediante el siguiente comando:

netsh winsock set autotuning off

El almacenamiento en búfer de envío dinámico para TCP se puede habilitar mediante el siguiente comando:

netsh winsock set autotuning on

Aunque no se recomienda, el almacenamiento en búfer de envío dinámico se puede deshabilitar desde una aplicación estableciendo el siguiente valor del Registro en cero:

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\AFD\Parameters\DynamicSendBufferDisable

Al cambiar el valor para el almacenamiento en búfer de envío dinámico mediante NetSh.exe o cambiar el valor del Registro, el equipo debe reiniciarse para que el cambio surta efecto.

Con el almacenamiento en búfer de envío dinámico en Windows 7 y Windows Server 2008 R2, el uso de los SIO_IDEAL_SEND_BACKLOG_CHANGE y SIO_IDEAL_SEND_BACKLOG_QUERY ICTLs solo se necesitan en circunstancias especiales.

Vea también

SIO_IDEAL_SEND_BACKLOG_CHANGE

socket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW