다음을 통해 공유


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

매개 변수

소켓을 식별하는 설명자입니다.

dwIoControlCode

작업을 위한 제어 코드입니다. 이 작업에 는 SIO_IDEAL_SEND_BACKLOG_QUERY 사용합니다.

lpvInBuffer

입력 버퍼에 대한 포인터입니다. 이 매개 변수는 이 작업에 사용되지 않습니다.

cbInBuffer

입력 버퍼의 크기(바이트)입니다. 이 매개 변수는 이 작업에 사용되지 않습니다.

lpvOutBuffer

출력 버퍼에 대한 포인터입니다. lpOverlappedlpCompletionRoutine 매개 변수가 NULL인 경우 이 매개 변수는 ULONG 데이터 형식을 가리킵니다.

cbOutBuffer

출력 버퍼의 크기(바이트)입니다. 이 매개 변수는 ULONG 데이터 형식의 크기 이상이어야 합니다.

lpcbBytesReturned

출력 버퍼에 저장된 데이터의 크기(바이트)를 수신하는 변수에 대한 포인터입니다.

출력 버퍼가 너무 작으면 호출이 실패하고 WSAGetLastErrorWSAEINVAL을 반환하고 lpcbBytesReturned 매개 변수가 DWORD 값 0을 가리킵니다.

lpOverlappedNULL이면 성공적인 호출에서 반환되는 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 겹치는 작업이 성공적으로 시작되었으며 나중에 완료가 표시됩니다.
WSA_OPERATION_ABORTED 소켓의 닫기 또는 SIO_FLUSH IOCTL 명령 실행으로 인해 겹치는 작업이 취소되었습니다.
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을 사용하려고 할 때도 반환됩니다.

설명

SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL은 Windows Server 2008, Windows Vista sp1(서비스 팩 1) 및 이후 버전의 운영 체제에서 지원됩니다.

Windows 소켓을 사용하여 TCP 연결을 통해 데이터를 보낼 때 가장 높은 처리량을 달성하려면 TCP에서 충분한 양의 데이터를 미해결 상태로 유지하는 것이 중요합니다(전송되었지만 아직 승인되지 않음). TCP 연결에 대한 최상의 처리량을 달성하기 위해 미해결 데이터 양에 이상적인 값을 ISB(이상적인 보내기 백로그) 크기라고 합니다. ISB 값은 TCP 연결의 대역폭 지연 제품 및 수신기의 보급 수신 창(그리고 부분적으로 네트워크의 정체 양)의 함수입니다.

연결당 ISB 값은 Windows Server 2008의 TCP 프로토콜 구현, WINDOWS Vista SP1 이상 버전의 운영 체제에서 사용할 수 있습니다. SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL은 애플리케이션에서 ISB 값이 연결에 대해 동적으로 변경될 때 알림을 받는 데 사용할 수 있습니다.

Windows Server 2008, WINDOWS Vista SP1 이상 버전의 운영 체제에서는 연결된 상태인 스트림 지향 소켓에서 SIO_IDEAL_SEND_BACKLOG_CHANGE 및 SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL이 지원됩니다.

TCP 연결에 대한 ISB 값의 범위는 이론적으로 0에서 최대 16MB까지 다양할 수 있습니다.

SIO_IDEAL_SEND_BACKLOG_CHANGESIO_IDEAL_SEND_BACKLOG_QUERY IOCTL의 일반적인 사용은 애플리케이션에서 사용하는 send 메서드를 기반으로 합니다. 두 가지 일반적인 사례에 대해 설명합니다.

한 번에 하나의 차단 또는 비차단 송신 요청을 수행하는 애플리케이션은 일반적으로 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)

위의 방식으로 TCP 소켓을 통해 ISB IOCTL을 사용하면 높은 대역폭 지연 제품과의 연결에서 처리량이 증가하는 대가로 메모리 사용량이 증가할 수 있습니다. Windows의 TCP 구현은 전체 시스템 메모리 사용에 따라 필요에 따라 ISB 값을 제한합니다.

SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL은 연결된 상태의 스트림 소켓에서만 허용됩니다. 그렇지 않으면 WSAIoctl 또는 WSPIoctl 함수가 WSAENOTCONN으로 실패합니다.

모든 IOCTL은 서비스 공급자의 구현에 따라 무기한 차단할 수 있습니다. 애플리케이션이 WSAIoctl 또는 WSPIoctl 함수 호출에서 차단을 허용할 수 없는 경우 특히 차단할 가능성이 있는 IOCTL 에 대해 겹치는 I/O가 권장됩니다.

SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL은 차단할 가능성이 없으므로 일반적으로 lpOverlappedlpCompletionRoutine 매개 변수가 NULL로 설정된 상태에서 동기적으로 호출됩니다.

SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL은 WSAEINTR로 실패하거나 다음과 같은 경우에 WSA_OPERATION_ABORTED 수 있습니다.

TCP 연결이 송신 방향에서 정상적으로 연결이 끊어졌습니다. 이는 매개 변수가 SD_SEND 설정된 방법, DisconnectEx 함수 호출 또는 dwFlags 매개 변수가 TF_DISCONNECT 또는TF_REUSE 설정된 TransmitFile 또는 TransmitPackets 함수 호출을 사용하여 종료 함수를 호출한 결과로 발생할 수 있습니다. TCP 연결이 다시 설정되거나 중단되었습니다. 요청은 I/O 관리자에 의해 취소됩니다.

이러한 IOCTL에 대한 두 개의 인라인 래퍼 함수는 Ws2tcpip.h 헤더 파일에 정의됩니다. 이러한 인라인 함수는 SIO_IDEAL_SEND_BACKLOG_CHANGE 사용하고 IOCTL을 직접 SIO_IDEAL_SEND_BACKLOG_QUERY 대신 사용하는 것이 좋습니다.

SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL에 대한 라인 래퍼 함수는 idealsendbacklognotify 함수입니다.

SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL에 대한 인라인 래퍼 함수는 idealsendbacklogquery 함수입니다.

TCP에 대한 동적 송신 버퍼링이 Windows 7 및 Windows Server 2008 R2에 추가되었습니다. 기본적으로 애플리케이션이 스트림 소켓에서 SO_SNDBUF 소켓 옵션을 설정하지 않는 한 TCP에 대한 동적 송신 버퍼링이 사용하도록 설정됩니다.

netsh를 사용하는 것은 TCP에 대한 동적 송신 버퍼링을 쿼리하거나 설정하는 데 권장되는 방법입니다.

TCP에 대한 동적 송신 버퍼링의 현재 값은 다음 명령을 사용하여 검색할 수 있습니다.

netsh winsock show autotuning

다음 명령을 사용하여 TCP에 대한 동적 송신 버퍼링을 사용하지 않도록 설정할 수 있습니다.

netsh winsock set autotuning off

다음 명령을 사용하여 TCP에 대한 동적 송신 버퍼링을 사용하도록 설정할 수 있습니다.

netsh winsock set autotuning on

권장되지는 않지만 다음 레지스트리 값을 0으로 설정하여 애플리케이션에서 동적 송신 버퍼링을 사용하지 않도록 설정할 수 있습니다.

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

NetSh.exe 사용하여 동적 송신 버퍼링의 값을 변경하거나 레지스트리 값을 변경하는 경우 변경 내용이 적용되려면 컴퓨터를 다시 시작해야 합니다.

Windows 7 및 Windows Server 2008 R2에서 동적 송신 버퍼링을 사용하면 특별한 상황에서만 SIO_IDEAL_SEND_BACKLOG_CHANGESIO_IDEAL_SEND_BACKLOG_QUERY IOCTL을 사용해야 합니다.

추가 정보

SIO_IDEAL_SEND_BACKLOG_CHANGE

소켓

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW