Share via


Código de control SIO_IDEAL_SEND_BACKLOG_CHANGE

Descripción

El código de control SIO_IDEAL_SEND_BACKLOG_CHANGE avisa a una aplicación cuando cambia el valor ideal de trabajo pendiente de envío (ISB) para la conexión.

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

int WSAIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_IDEAL_SEND_BACKLOG_CHANGE, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  NULL,         // output buffer
  0,       // 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_CHANGE, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  NULL,         // output buffer
  0,       // 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 de la operación. Use SIO_IDEAL_SEND_BACKLOG_CHANGE 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 no se usa para esta operación.

cbOutBuffer

Tamaño, en bytes, del búfer de salida. Este parámetro debe establecerse en cero.

lpcbBytesReturned

Puntero a una variable que recibe el tamaño en bytes de los datos almacenados en el búfer de salida. Este parámetro devuelto apunta a un valor DWORD de cero para esta operación, ya que no hay ninguna salida.

lpvOverlapped

Puntero a una estructura WSAOVERLAPPED.

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

Si s 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.

Para las operaciones superpuestas, las funciones WSAIoctl y WSPIoctl se devuelven 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 se devuelve hasta que se haya completado la operación o hasta que 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 el proveedor usará 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 esta está pendiente, la función WSAIoctl o WSPIoctl devuelve SOCKET_ERROR. Para obtener información ampliada del error, llame a WSAGetLastError.

Código de error Significado
WSA_IO_PENDING Una operación superpuesta se inició correctamente y la finalización se indicará más adelante.
WSA_OPERATION_ABORTED Se canceló una operación superpuesta debido al cierre del socket o a la ejecución del comando IOCTL SIO_FLUSH.
WSAEFAULT El parámetro lpOverlapped o lpCompletionRoutine no está totalmente contenido 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, uno de los parámetros de entrada especificados no es aceptable, o el comando no es aplicable al tipo de socket especificado. Este error se devuelve si el parámetro cbOutBuffer no es cero.
WSAENETDOWN Se ha producido un 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 IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE. Este error también se devuelve cuando se intenta usar el IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE en un socket de datagrama.

Comentarios

El IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE es compatible con Windows Server 2008, Windows Vista con Service Pack 1 (SP1) y las 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 las versiones posteriores del sistema operativo. Una aplicación puede usar el IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE para recibir una notificación cuando el valor de ISB cambie dinámicamente para una conexión.

En Windows Server 2008, Windows Vista con SP1 y las versiones posteriores del sistema operativo, los IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE y SIO_IDEAL_SEND_BACKLOG_QUERY se admiten en sockets orientados a flujos que se encuentran en un estado conectado.

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

Consulte la página de referencia de IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY para ver el uso típico del mecanismo ISB con el fin de lograr un mejor rendimiento a través de conexiones de productos con retraso de ancho de banda alto.

El IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE 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.

El IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE no usa búferes de entrada o salida y se suspende o bloquea hasta que se produce un cambio de ISB en la conexión subyacente. Cuando se completa este IOCTL, una aplicación Winsock puede usar el IOCTL SIO_IDEAL_SEND_BACKLOG_QUERY para recuperar el nuevo valor de ISB en la conexión.

El IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE no admite el modo de no bloqueo. Se permite que una aplicación emita este IOCTL en un socket sin bloqueo, pero el IOCTL simplemente se bloqueará o suspenderá hasta que cambie el valor de ISB.

Si los parámetros lpOverlapped y lpCompletionRoutine son NULL, el socket de esta función se tratará como un socket no superpuesto. En el caso de un socket no superpuesto, se omiten los parámetros lpOverlapped y lpCompletionRoutine, con la salvedad de que la función se puede bloquear si el socket s está en modo de bloqueo. Si el socket s está en modo de no bloqueo, esta función se bloqueará de todas maneras, ya que este IOCTL determinado no admite el modo de no bloqueo.

En el caso de los sockets superpuestos, se iniciarán las operaciones que no puedan completarse inmediatamente y se indicará su finalización más adelante.

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 a la función WSAIoctl o WSPIoctl, se recomiendan las E/S superpuestas para los IOCTL que sean particularmente propensos a bloquearse.

El IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE proporciona una notificación y, en principio, se bloqueará o quedará pendiente hasta que cambie el valor ISB. Por lo tanto, normalmente se llamaría de forma asincrónica con el parámetro lpOverlapped establecido en una estructura WSAOVERLAPPED válida.

El IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE 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 de apagado 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.
  • La aplicación emite un IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE cuando ya hay una solicitud de notificación pendiente. No se permite más de una solicitud SIO_IDEAL_SEND_BACKLOG_CHANGE pendiente a la vez.
  • El administrador de E/S cancela la solicitud.
  • El socket está cerrado.

En el archivo de encabezado Ws2tcpip.h se definen dos funciones de encapsulado insertadas para estos IOCTL. Se recomienda usar estas funciones insertadas en lugar de usar directamente los IOCTL SIO_IDEAL_SEND_BACKLOG_CHANGE y SIO_IDEAL_SEND_BACKLOG_QUERY.

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

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

Consulte también

SIO_IDEAL_SEND_BACKLOG_QUERY

socket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW