Compartir a través de


código de control de SIO_LOOPBACK_FAST_PATH

Descripción

El código de control SIO_LOOPBACK_FAST_PATH configura un socket TCP para una menor latencia y operaciones más rápidas en la interfaz de bucle invertido.

Importante El SIO_LOOPBACK_FAST_PATH está en desuso y no se recomienda usarse en el código.

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

Parámetros

s

Descriptor que identifica un socket.

dwIoControlCode

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

lpvInBuffer

Puntero al búfer de entrada. Este parámetro contiene un puntero a un valor booleano que indica si el socket debe configurarse para operaciones de bucle invertido rápido.

cbInBuffer

Tamaño, en bytes, del búfer de entrada.

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.

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 La operación de E/S superpuesta está en curso. Este valor se devuelve si se inició correctamente una operación superpuesta y la finalización se indicará en un momento posterior.
WSA_OPERATION_ABORTED Se ha anulado la operación de E/S debido a una solicitud de la aplicación o una salida del subproceso. Este error se devuelve si se canceló una operación superpuesta debido al cierre del socket o a la ejecución del comando SIO_FLUSH IOCTL .
WSAEACCES Se intentó acceder a un socket de una manera prohibida por sus permisos de acceso. Este error se devuelve en varias condiciones para las reservas de puertos persistentes que incluyen lo siguiente: el usuario carece de los privilegios administrativos necesarios en el equipo local o la aplicación no se ejecuta en un shell mejorado como administrador integrado (RunAs administrator).
WSAEFAULT El sistema detectó una dirección de puntero no válida al intentar usar un argumento de puntero en una llamada. Este error se devuelve del parámetro lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped o lpCompletionRoutine no está totalmente incluido en una parte válida del espacio de direcciones del usuario.
WSAEINPROGRESS Se está ejecutando una operación de bloqueo actualmente. Este error se devuelve si se invoca la función cuando hay una devolución de llamada en curso.
WSAEINTR Una operación de bloqueo se interrumpió mediante una llamada a WSACancelBlockingCall. Este error se devuelve si se interrumpió una operación de bloqueo.
WSAEINVAL Se proporcionó un argumento no válido. Este error se devuelve si el parámetro dwIoControlCode no es un comando válido o si un parámetro de entrada especificado no es aceptable o el comando no es aplicable al tipo de socket especificado.
WSAENETDOWN Una operación de socket encontró una red inactiva. Este error se devuelve si se ha producido un error en el subsistema de red.
WSAENOTSOCK Se intentó realizar una operación en algo que no es un socket. Este error se devuelve si el descriptor s no es un socket.
WSAEOPNOTSUPP La operación intentada no se admite para el tipo de objeto al que se hace referencia. Este error se devuelve si no se admite el comando IOCTL especificado. Este error también se devuelve si el proveedor de transporte no admite el SIO_LOOPBACK_FAST_PATH IOCTL.

Comentarios

Una aplicación puede usar el SIO_LOOPBACK_FAST_PATH IOCTL para reducir la latencia y mejorar el rendimiento de las operaciones de bucle invertido en un socket TCP. Este IOCTL solicita que la pila TCP/IP use una ruta de acceso rápida especial para las operaciones de bucle invertido en este socket. El SIO_LOOPBACK_FAST_PATH IOCTL solo se puede usar con sockets TCP. Este IOCTL debe usarse en ambos lados de la sesión de bucle invertido. La ruta de acceso rápida de bucle invertido TCP se admite mediante la interfaz de bucle invertido IPv4 o IPv6.

El socket que planea iniciar la solicitud de conexión debe aplicar este IOCTL antes de realizar la solicitud de conexión. Por lo tanto, el socket usado por la función connect, ConnectEx, WSAConnect, WSAConnectByList o WSAConnectByName para iniciar la conexión debe aplicar este IOCTL para usar la ruta de acceso rápida para las operaciones de bucle invertido.

El socket que escucha la solicitud de conexión debe aplicar este IOCTL antes de aceptar la conexión. Por lo tanto, el socket usado por la función de escucha debe aplicar este IOCTL, por lo que cualquier socket que se acepte usará la ruta de acceso rápida para el bucle invertido. Los sockets devueltos por la función de escucha y pasados a la función accept, AcceptEx o WSAAccept se marcarán para usar la ruta de acceso rápida especial para las operaciones de bucle invertido.

Una vez que una aplicación establece la conexión en una interfaz de bucle invertido mediante la ruta de acceso rápida, todos los paquetes durante la duración de la conexión deben usar la ruta de acceso rápida.

La aplicación de SIO_LOOPBACK_FAST_PATH a un socket que se conectará a una ruta de acceso que no sea de bucle invertido no tendrá ningún efecto.

Esta optimización de bucle invertido TCP da como resultado paquetes que fluyen a través de la capa de transporte (TL) en lugar del bucle invertido tradicional a través de la capa de red. Esta optimización mejora la latencia de los paquetes de bucle invertido. Una vez que una aplicación opta por una configuración de nivel de conexión para usar la ruta de acceso rápida de bucle invertido, todos los paquetes seguirán la ruta de acceso de bucle invertido. En el caso de las comunicaciones de bucle invertido, no se espera la congestión y la caída de paquetes. La noción de control de congestión y entrega confiable en TCP será innecesaria. Sin embargo, esto no es cierto para el control de flujo. Sin el control de flujo, el remitente puede sobrecargar el búfer de recepción, lo que provoca un comportamiento erróneo de bucle invertido TCP. El control de flujo de la ruta de acceso de bucle invertido optimizado para TCP se mantiene colocando solicitudes de envío en una cola. Cuando el búfer de recepción está lleno, la pila TCP/IP garantiza que los envíos no se completarán hasta que se mantenga el control de flujo de mantenimiento de la cola.

Las conexiones de bucle invertido de ruta rápida TCP en presencia de una llamada de la Plataforma de filtrado de Windows (PMA) para los datos de conexión deben tomar la ruta de acceso lenta no optimizada para bucle invertido. Por lo tanto, los filtros DE PMA impedirán que se use esta nueva ruta de acceso rápida de bucle invertido. Cuando se habilita un filtro PMA, el sistema usaremos la ruta de acceso lenta incluso si se estableció el SIO_LOOPBACK_FAST_PATH IOCTL. Esto garantiza que las aplicaciones en modo de usuario tengan la capacidad de seguridad completa del PMA.

De forma predeterminada, SIO_LOOPBACK_FAST_PATH está deshabilitado.

Solo se admite un subconjunto de las opciones de socket TCP/IP cuando se usa el SIO_LOOPBACK_FAST_PATH IOCTL para habilitar la ruta de acceso rápida de bucle invertido en un socket. La lista de opciones admitidas incluye lo siguiente:

  • 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

Consulte también

Opciones de socket de IPPROTO_IP

Opciones de socket de IPPROTO_IPV6

Opciones de socket de IPPROTO_TCP

socket

Opciones de socket de SOL_SOCKET

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW