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.
);
매개 변수
초
소켓을 식별하는 설명자입니다.
dwIoControlCode
작업을 위한 제어 코드입니다. 이 작업에 는 SIO_LOOPBACK_FAST_PATH 사용합니다.
lpvInBuffer
입력 버퍼에 대한 포인터입니다. 이 매개 변수에는 빠른 루프백 작업을 위해 소켓을 구성해야 하는지 여부를 나타내는 부울 값에 대한 포인터가 포함되어 있습니다.
cbInBuffer
입력 버퍼의 크기(바이트)입니다.
lpvOutBuffer
출력 버퍼에 대한 포인터입니다. 이 매개 변수는 이 작업에 사용되지 않습니다.
cbOutBuffer
출력 버퍼의 크기(바이트)입니다. 이 매개 변수는 0으로 설정해야 합니다.
lpcbBytesReturned
출력 버퍼에 저장된 데이터의 크기(바이트)를 수신하는 변수에 대한 포인터입니다.
출력 버퍼가 너무 작으면 호출이 실패하고 WSAGetLastError 가 WSAEINVAL을 반환하고 lpcbBytesReturned 매개 변수가 DWORD 값 0을 가리킵니다.
lpOverlapped가 NULL인 경우 성공적인 호출에서 반환되는 lpcbBytesReturned 매개 변수가 가리키는 DWORD 값은 0일 수 없습니다.
lpOverlapped 매개 변수가 겹치는 소켓에 대해 NULL이 아닌 경우 즉시 완료할 수 없는 작업이 시작되고 나중에 완료가 표시됩니다. 겹치는 작업이 완료될 때까지 저장된 데이터의 크기를 확인할 수 없으므로 반환되는 lpcbBytesReturned 매개 변수가 가리키는 DWORD 값은 0일 수 있습니다. 작업이 완료되면 적절한 완료 메서드가 신호를 받으면 최종 완료 상태 검색할 수 있습니다.
lpvOverlapped
WSAOVERLAPPED 구조체에 대한 포인터입니다.
소켓 이 겹치는 특성 없이 만들어진 경우 lpOverlapped 매개 변수는 무시됩니다.
가 겹치는 특성으로 열렸고 lpOverlapped 매개 변수가 NULL이 아닌 경우 작업은 겹치는(비동기) 작업으로 수행됩니다. 이 경우 lpOverlapped 매개 변수는 유효한 WSAOVERLAPPED 구조를 가리킵니다.
겹치는 작업의 경우 WSAIoctl 또는 WSPIoctl 함수는 즉시 반환되고 작업이 완료되면 적절한 완료 메서드가 신호를 보냅니다. 그렇지 않으면 작업이 완료되거나 오류가 발생할 때까지 함수가 반환되지 않습니다.
lpCompletionRoutine
형식: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
작업이 완료되었을 때 호출되는 완료 루틴에 대한 포인터입니다(겹치지 않는 소켓의 경우 무시됨).
lpThreadId
WPUQueueApc에 대한 후속 호출에서 공급자가 사용할 WSATHREADID 구조체에 대한 포인터입니다. 공급자는 WPUQueueApc 함수가 반환될 때까지 참조된 WSATHREADID 구조체(동일한 포인터가 아님)를 저장해야 합니다.
참고 이 매개 변수는 WSPIoctl 함수에 만 적용됩니다.
lpErrno
오류 코드에 대한 포인터입니다.
참고 이 매개 변수는 WSPIoctl 함수에 만 적용됩니다.
반환 값
작업이 성공적으로 완료되면 WSAIoctl 또는 WSPIoctl 함수는 0을 반환합니다.
작업이 실패하거나 보류 중인 경우 WSAIoctl 또는 WSPIoctl 함수는 SOCKET_ERROR 반환합니다. 확장된 오류 정보를 얻으려면 WSAGetLastError를 호출합니다.
오류 코드 | 의미 |
---|---|
WSA_IO_PENDING | 중첩된 I/O 작업이 진행 중입니다. 겹치는 작업이 성공적으로 시작되고 나중에 완료가 표시되면 이 값이 반환됩니다. |
WSA_OPERATION_ABORTED | 스레드 종료 또는 애플리케이션 요청으로 인해 I/O 작업이 중단되었습니다. 이 오류는 소켓의 닫기 또는 SIO_FLUSH IOCTL 명령 실행으로 인해 겹치는 작업이 취소된 경우 반환됩니다. |
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을 적용해야 하므로 허용되는 모든 소켓은 루프백에 빠른 경로를 사용합니다. listen 함수에서 반환되고 accept, AcceptEx 또는 WSAAccept 함수에 전달된 모든 소켓은 루프백 작업에 특수한 빠른 경로를 사용하도록 표시됩니다.
애플리케이션이 빠른 경로를 사용하여 루프백 인터페이스에서 연결을 설정하면 연결 수명 동안 모든 패킷이 빠른 경로를 사용해야 합니다.
루프백이 아닌 경로에 연결될 소켓에 SIO_LOOPBACK_FAST_PATH 적용해도 아무런 효과가 없습니다.
이 TCP 루프백 최적화는 네트워크 계층을 통한 기존 루프백 대신 TL(전송 계층)을 통과하는 패킷을 생성합니다. 이 최적화는 루프백 패킷의 대기 시간을 개선합니다. 애플리케이션이 루프백 빠른 경로를 사용하기 위해 연결 수준 설정을 옵트인하면 모든 패킷이 루프백 경로를 따릅니다. 루프백 통신의 경우 정체 및 패킷 삭제가 예상되지 않습니다. TCP에서 정체 제어 및 안정적인 배달의 개념은 필요하지 않습니다. 그러나 흐름 제어에는 이 값이 적용되지 않습니다. 흐름 제어가 없으면 발신자가 수신 버퍼를 압도하여 잘못된 TCP 루프백 동작을 발생시킬 수 있습니다. TCP 최적화 루프백 경로의 흐름 제어는 큐에 보내기 요청을 배치하여 유지 관리됩니다. 수신 버퍼가 가득 차면 TCP/IP 스택은 흐름 제어를 유지 관리하는 큐가 서비스될 때까지 전송이 완료되지 않도록 보장합니다.
연결 데이터에 대한 WFP(Windows 필터링 플랫폼) 설명선이 있는 경우 TCP 빠른 경로 루프백 연결은 루프백에 최적화되지 않은 느린 경로를 사용해야 합니다. 따라서 WFP 필터는 이 새로운 루프백 빠른 경로가 사용되지 않도록 합니다. WFP 필터를 사용하도록 설정하면 SIO_LOOPBACK_FAST_PATH IOCTL이 설정된 경우에도 시스템이 느린 경로를 사용합니다. 이렇게 하면 사용자 모드 애플리케이션에 전체 WFP 보안 기능이 있습니다.
기본적으로 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