Share via


LPWSPIOCTL 콜백 함수(ws2spi.h)

LPWSPIoctl 함수는 소켓의 모드를 제어합니다.

구문

LPWSPIOCTL Lpwspioctl;

int Lpwspioctl(
  [in]  SOCKET s,
  [in]  DWORD dwIoControlCode,
  [in]  LPVOID lpvInBuffer,
  [in]  DWORD cbInBuffer,
  [out] LPVOID lpvOutBuffer,
  [in]  DWORD cbOutBuffer,
  [out] LPDWORD lpcbBytesReturned,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
  [in]  LPWSATHREADID lpThreadId,
  [in]  LPINT lpErrno
)
{...}

매개 변수

[in] s

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

[in] dwIoControlCode

수행할 작업의 제어 코드입니다.

[in] lpvInBuffer

입력 버퍼에 대한 포인터입니다.

[in] cbInBuffer

입력 버퍼의 크기(바이트)입니다.

[out] lpvOutBuffer

출력 버퍼에 대한 포인터입니다.

[in] cbOutBuffer

출력 버퍼의 크기(바이트)입니다.

[out] lpcbBytesReturned

실제 출력 바이트 수에 대한 포인터입니다.

[in] lpOverlapped

WSAOverlapped 구조체에 대한 포인터입니다(겹치지 않는 소켓의 경우 무시됨).

[in] lpCompletionRoutine

형식: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

작업이 완료되었을 때 호출되는 완료 루틴에 대한 포인터입니다(겹치지 않는 소켓의 경우 무시됨). 설명 부분을 참조하세요.

[in] lpThreadId

WPUQueueApc에 대한 후속 호출에서 공급자가 사용할 WSATHREADID 구조체에 대한 포인터입니다. 공급자는 WPUQueueApc 함수가 반환될 때까지 참조된 WSATHREADID 구조체(포인터 아님)를 저장해야 합니다.

[in] lpErrno

오류 코드에 대한 포인터입니다.

반환 값

오류가 발생하지 않고 작업이 즉시 완료되면 LPWSPIoctl 은 0을 반환합니다. 이 경우 완료 루틴(지정된 경우)은 이미 큐에 대기되어 있습니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 lpErrno에서 특정 오류 코드를 사용할 수 있습니다. 오류 코드 WSA_IO_PENDING 겹치는 작업이 성공적으로 시작되었으며 나중에 완료가 표시됨을 나타냅니다. 다른 오류 코드는 겹치는 작업이 시작되지 않았으며 완료 표시가 발생하지 않음을 나타냅니다.

오류 코드 의미
WSA_IO_PENDING
겹치는 작업이 성공적으로 시작되었으며 나중에 완료가 표시됩니다.
WSAEFAULT
lpvInBuffer, lpvOutBuffer 또는 lpcbBytesReturned 매개 변수가 사용자 주소 공간의 유효한 부분에 완전히 포함되지 않았거나 cbInBuffer 또는 cbOutBuffer 매개 변수가 너무 작습니다.
WSAEINVAL
dwIoControlCode가 유효한 명령이 아니거나 제공된 입력 매개 변수가 허용되지 않거나 명령이 제공된 소켓 유형에 적용되지 않습니다.
WSAEINPROGRESS
콜백이 진행 중일 때 함수가 호출됩니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAENOTSOCK
설명자 소켓이 아닙니다.
WSAEOPNOTSUPP
지정된 IOCTL 명령을 실현할 수 없습니다. 예를 들어 SIO_SET_QOS 지정된 흐름 사양을 충족할 수 없습니다.
WSAEWOULDBLOCK
소켓이 차단되지 않는 것으로 표시되고 요청된 작업이 차단됩니다.

설명

이 루틴은 소켓, 전송 프로토콜 또는 통신 하위 시스템에 연결된 운영 매개 변수를 설정하거나 검색하는 데 사용됩니다. lpOverlappedlpCompletionRoutine모두 NULL인 경우 이 함수의 소켓은 오버랩되지 않은 소켓으로 처리됩니다.

겹치지 않는 소켓의 경우 lpOverlappedlpCompletionRoutine 매개 변수는 무시되며 소켓 차단 모드에 있으면 이 함수를 차단할 수 있습니다. 소켓 비블로킹 모드인 경우 지정된 작업을 즉시 완료할 수 없는 경우 이 함수는 WSAEWOULDBLOCK 을 반환할 수 있습니다. 이 경우 Windows 소켓 SPI 클라이언트는 Windows 메시지(LPWSPAsyncSelect 또는 이벤트(LPWSPEventSelect 사용) 기반 알림 메커니즘을 사용하여 소켓을 차단 모드로 변경하고 해당 네트워크 이벤트(예: SIO_ROUTING_INTERFACE_CHANGE FD_ROUTING_INTERFACE_CHANGE 또는 SIO_ADDRESS_LIST_CHANGE 경우 FD_ADDRESS_LIST_CHANGE)를 기다릴 수 있습니다.

겹치는 소켓의 경우 즉시 완료할 수 없는 작업이 시작되고 나중에 완료가 표시됩니다. 반환되는 lpcbBytesReturned 매개 변수가 가리키는 DWORD 값은 무시될 수 있습니다. 작업이 완료되었을 때 적절한 완료 메서드가 신호를 받으면 반환되는 최종 완료 상태 바이트를 검색할 수 있습니다.

모든 IOCTL은 서비스 공급자의 구현에 따라 무기한 차단할 수 있습니다. Windows 소켓 SPI 클라이언트가 LPWSPIoctl 호출에서 차단을 허용할 수 없는 경우 다음을 포함할 가능성이 가장 높은 IOCTL에는 겹치는 I/O가 권장됩니다.

  • SIO_ADDRESS_LIST_CHANGE
  • SIO_FINDROUTE
  • SIO_FLUSH
  • SIO_GET_QOS
  • SIO_GET_GROUP_QOS
  • SIO_ROUTING_INTERFACE_CHANGE
  • SIO_SET_QOS
  • SIO_SET_GROUP_QOS

일부 프로토콜별 IOCTL은 특히 차단될 수 있습니다. 사용 가능한 정보는 관련 프로토콜별 부속서를 확인합니다.

lpCompletionRoutine 매개 변수가 가리키는 완료 루틴의 프로토타입은 다음과 같습니다.

void CALLBACK 
CompletionRoutine(  
  IN DWORD           dwError, 
  IN DWORD           cbTransferred, 
  IN LPWSAOVERLAPPED lpOverlapped, 
  IN DWORD           dwFlags 
);

CompletionRoutine은 애플리케이션에서 제공하는 함수 이름의 자리 표시자입니다. dwError 매개 변수는 lpOverlapped 매개 변수에 표시된 대로 겹치는 작업에 대한 완료 상태 지정합니다. cbTransferred 매개 변수는 수신된 바이트 수를 지정합니다. dwFlags 매개 변수는 이 IOCTL에 사용되지 않습니다. 완료 루틴은 값을 반환하지 않습니다.

dwIoControlCode 매개 변수가 이제 32비트 엔터티인 만큼 opcode 식별자 공간을 분할하는 편리한 방법을 제공하는 인코딩 체계를 채택할 수 있습니다. dwIoControlCode 매개 변수는 Windows 소켓 1.1 및 UNIX 제어 코드와의 이전 버전과의 호환성을 유지하면서 새 제어 코드를 추가할 때 프로토콜 및 공급업체의 독립성을 허용하도록 생성됩니다. dwIoControlCode 매개 변수는 다음과 같은 형식입니다.

bit 31 bit 30 bit 29 bits 28 및 27 bits 26 thru 16 bits 15 thru 0
I O V T 공급업체/주소 패밀리 코드

입력 버퍼가IOC_IN 코드에 유효한 경우 설정됩니다.

출력 버퍼가 IOC_OUT 코드에 유효한 경우 O 가 설정됩니다. 입력 매개 변수와 출력 매개 변수가 모두 있는 코드의 경우 IO 가 모두 설정됩니다.

IOC_VOID 같이 코드에 대한 매개 변수가 없으면 V가 설정됩니다.

T 는 IOCTL의 형식을 정의하는 2비트 수량입니다. 다음 값이 정의됩니다.

  • 0IOCTL이 FIONREAD, FIONBIO 등과 마찬가지로 표준 UNIX IOCTL 코드임을 나타냅니다.
  • 1 은 IOCTL이 일반 Windows 소켓 2 IOCTL 코드임을 나타냅니다. Windows 소켓 2에 대해 정의된 새 IOCTL 코드에는 T == 1이 있습니다.
  • 2 는 IOCTL이 특정 주소 패밀리에만 적용됨을 나타냅니다.
  • 3 IOCTL은 특정 공급업체의 공급자에게만 적용됩니다. 이 유형을 사용하면 공급업체 /주소 패밀리 멤버에 표시되는 공급업체 번호를 회사에 할당할 수 있습니다. 그런 다음 공급업체는 IOCTL을 클리어링하우스에 등록하지 않고도 해당 공급업체에 한정된 새 IOCTL을 정의하여 공급업체의 유연성과 프라이버시를 제공할 수 있습니다.

공급업체/주소 패밀리는 코드를 소유하는 공급업체(T3인 경우) 또는 코드가 적용되는 주소 패밀리(T == == 2인 경우)를 포함하는 공급업체를 정의하는11비트 수량입니다. UNIX IOCTL 코드(T == 0)인 경우 이 멤버의 값은 UNIX의 코드와 동일합니다. 제네릭 Windows 소켓 2 IOCTL(T1 == )인 경우 이 멤버를 코드 멤버의 확장으로 사용하여 추가 코드 값을 제공할 수 있습니다.

코드 는 작업에 대한 특정 IOCTL 코드입니다.

지원되는 UNIX 명령은 다음과 같습니다.

FIONBIO

소켓 s에서 차단 해제 모드를 사용하거나 사용하지 않도록 설정합니다. lpvInBuffer 매개 변수는 서명되지 않은 long을 가리킵니다. 비블로킹 모드를 사용하도록 설정하려면 0이 아니고 사용하지 않도록 설정하려면 0이 아닙니다. 소켓이 만들어지면 차단 모드에서 작동합니다(즉, 비블로킹 모드가 비활성화됨). 이는 BSD(Berkeley Software Distribution) 소켓과 일치합니다.

LPWSPAsyncSelect 또는 LPWSPEventSelect 루틴은 자동으로 소켓을 차단 해제 모드로 설정합니다. LPWSPAsyncSelect 또는 LPWSPEventSelect가 소켓에서 실행된 경우 LPWSPIoctl을 사용하여 소켓을 차단 모드로 다시 설정하려는 시도는 WSAEINVAL에서 실패합니다. 소켓을 다시 차단 모드로 설정하려면 먼저 lEvent 매개 변수가 0인 LPWSPAsyncSelect를 호출하여 LPWSPAsyncSelect를 사용하지 않도록 설정하거나 lNetworkEvents 매개 변수가 0인 LPWSPEventSelect를 호출하여 LPWSPEventSelect를 사용하지 않도록 설정해야 합니다.

FIONREAD

소켓 s에서 원자성으로 읽을 수 있는 데이터의 양을 결정 합니다. lpvOutBuffer 매개 변수는 WSAIoctl에서 결과를 저장하는 부호 없는 long을 가리킵니다.

s 매개 변수에 전달된 소켓이 스트림 지향(예: SOCK_STREAM 형식)인 경우 FIONREAD는 단일 수신 작업에서 읽을 수 있는 총 데이터 양을 반환합니다. 이는 일반적으로 소켓에 대기 중인 총 데이터 양과 동일합니다(데이터 스트림은 바이트 지향이므로 보장되지 않음).

매개 변수에 전달된 소켓이 메시지 지향(예: SOCK_DGRAM 형식)인 경우 FIONREAD는 소켓에 큐에 대기 중인 첫 번째 데이터그램(메시지)의 크기가 아니라 읽을 수 있는 총 바이트 수를 반환합니다.

SIOCATMARK

모든 OOB 데이터를 읽었는지 여부를 결정합니다. 이는 모든 OOB 데이터(SO_OOBINLINE)의 인라인 수신을 위해 구성된 스트림 스타일의 소켓(예: SOCK_STREAM 형식)에만 적용됩니다. OOB 데이터가 읽기를 대기하지 않는 경우 작업은 TRUE를 반환 합니다. 그렇지 않으면 FALSE를 반환하고 소켓에서 수행된 다음 수신 작업은 표시 앞의 데이터의 일부 또는 전부를 검색합니다. Windows 소켓 SPI 클라이언트는 SIOCATMARK 작업을 사용하여 남아 있는지 여부를 확인해야 합니다. 긴급(OOB) 데이터 앞에 일반 데이터가 있으면 순서대로 수신됩니다. (수신 작업은 동일한 호출에서 OOB 및 일반 데이터를 혼합하지 않습니다.) lpvOutBuffer는LPWSPIoctl에서 결과를 저장하는 BOOL을 가리킵니다.

지원되는 Windows 소켓 2 명령은 다음과 같습니다.

SIO_ACQUIRE_PORT_RESERVATION (opcode 설정: I, T==3)

TCP 또는 UDP 포트 블록에 대한 런타임 예약을 요청합니다. 런타임 포트 예약의 경우 포트 풀은 예약이 부여된 소켓의 프로세스에서 예약을 사용해야 합니다. 런타임 포트 예약은 SIO_ACQUIRE_PORT_RESERVATION IOCTL이 호출된 소켓의 수명 동안만 지속됩니다. 반면, CreatePersistentTcpPortReservation 또는 CreatePersistentUdpPortReservation 함수를 사용하여 만든 영구 포트 예약은 영구 예약을 가져올 수 있는 모든 프로세스에서 사용될 수 있습니다.

자세한 내용은 SIO_ACQUIRE_PORT_RESERVATION 참조를 참조하세요.

SIO_ACQUIRE_PORT_RESERVATION Windows Vista 이상 버전의 운영 체제에서 지원됩니다.

SIO_ADDRESS_LIST_CHANGE (opcode 설정: T==1)

Windows Sockets SPI 클라이언트가 바인딩할 수 있는 소켓 프로토콜 패밀리의 로컬 전송 주소 목록에서 변경 내용에 대한 알림을 받으려면 이 IOCTL이 완료되면 출력 정보가 제공되지 않습니다. 완료는 사용 가능한 로컬 주소 목록이 변경되었으며 SIO_ADDRESS_LIST_QUERY 통해 다시 쿼리되어야 했음을 나타냅니다.

Windows 소켓 SPI 클라이언트가 겹치는 I/O를 사용하여 SIO_ADDRESS_LIST_CHANGE 요청을 완료하여 변경 알림을 받는 것으로 가정합니다(필수는 아님). 또는 겹치지 않는 매개 변수(lpOverlappedlpCompletionRoutineNULL로 설정됨)가 없는 비블로킹 소켓에서 SIO_ADDRESS_LIST_CHANGE IOCTL이 실행되면 오류 WSAEWOULDBLOCK으로 즉시 완료됩니다. 그런 다음 Windows Sockets SPI 클라이언트는 네트워크 이벤트 비트 마스크에 설정된 FD_ADDRESS_LIST_CHANGE 비트로 LPWSPEventSelect 또는 LPWSPAsyncSelect 에 대한 호출을 통해 주소 목록 변경 이벤트를 기다릴 수 있습니다.

SIO_ADDRESS_LIST_QUERY (opcode 설정: O, T==1)

애플리케이션이 바인딩할 수 있는 소켓 프로토콜 패밀리의 로컬 전송 주소 목록을 가져옵니다. 주소 목록은 주소 패밀리에 따라 다르며 일부 주소는 목록에서 제외됩니다.

참고

Windows 플러그 앤 플레이 환경에서 주소를 동적으로 추가하고 제거할 수 있습니다. 따라서 애플리케이션은 SIO_ADDRESS_LIST_QUERY 반환된 정보를 영구적으로 사용할 수 없습니다. 애플리케이션은 겹치는 I/O 또는 FD_ADDRESS_LIST_CHANGE 이벤트를 통해 알림을 제공하는 SIO_ADDRESS_LIST_CHANGE IOCTL을 통해 주소 변경 알림을 등록할 수 있습니다. 애플리케이션에 항상 현재 주소 목록 정보가 있음을 보장하기 위해 다음 작업 시퀀스를 사용할 수 있습니다.

 

  • IOCTL SIO_ADDRESS_LIST_CHANGE 문제
  • IOCTL 문제 SIO_ADDRESS_LIST_QUERY
  • SIO_ADDRESS_LIST_CHANGE IOCTL이 주소 목록 변경의 적용을 알릴 때마다(겹치는 I/O를 통해 또는 FD_ADDRESS_LIST_CHANGE 이벤트 신호를 통해) 전체 작업 순서를 반복해야 합니다.

자세한 내용은 SIO_ADDRESS_LIST_QUERY 참조를 참조하세요. SIO_ADDRESS_LIST_QUERY Windows 2000 이상에서 지원됩니다.

SIO_ASSOCIATE_HANDLE (opcode 설정: I, T==1)

이 소켓을 도우미 인터페이스의 지정된 핸들과 연결합니다. 입력 버퍼에는 도우미 인터페이스의 매니페스트 상수(예: TH_NETDEV 및 TH_TAPI)에 해당하는 정수 값과 지정된 도우미 인터페이스의 핸들인 값 및 기타 필수 정보가 포함됩니다. 자세한 내용은 Windows 소켓 2 Protocol-Specific 부록 및/또는 설명서에서 특정 도우미 인터페이스에 대한 적절한 섹션을 참조하세요. (이러한 리소스는 영어로만 사용할 수 있습니다.) 총 크기는 입력 버퍼 길이에 반영됩니다. 출력 버퍼가 필요하지 않습니다. WSAENOPROTOOPT 오류 코드는 이 IOCTL을 지원하지 않는 서비스 공급자에 대해 표시됩니다. 이 IOCTL에 연결된 핸들은 SIO_TRANSLATE_HANDLE 사용하여 검색할 수 있습니다.

예를 들어 특정 공급자가 다음을 제공하는 경우 도우미 인터페이스를 사용할 수 있습니다.

  • 소켓의 동작을 추가로 제어할 수 있습니다.
  • 기존 Windows 소켓 함수(또는 향후에 해당)에 매핑되지 않는 공급자별 컨트롤입니다.

소켓에서 지원할 수 있는 다른 인터페이스를 검색하고 추적하려면 이 IOCTL 대신 COM(Component Object Model)을 사용하는 것이 좋습니다. 이 IOCTL은 COM을 사용할 수 없거나 다른 이유로 사용할 수 없는 시스템과 이전 버전과의 호환성을 위해 제공됩니다.

SIO_ASSOCIATE_PORT_RESERVATION (opcode 설정: I, T==3)

포트 예약 토큰으로 식별된 TCP 또는 UDP 포트 블록에 대한 영구 또는 런타임 예약과 소켓을 연결합니다. 소켓이 바인딩되기 전에 SIO_ASSOCIATE_PORT_RESERVATION IOCTL을 실행해야 합니다. 소켓이 바인딩되면 지정된 토큰으로 식별된 포트 예약에서 소켓에 할당된 포트가 선택됩니다. 지정된 예약에서 사용할 수 있는 포트가 없으면 Bind 함수 호출이 실패합니다.

자세한 내용은 SIO_ASSOCIATE_PORT_RESERVATION 참조를 참조하세요.

SIO_ASSOCIATE_PORT_RESERVATION Windows Vista 이상 버전의 운영 체제에서 지원됩니다.

SIO_BASE_HANDLE (opcode 설정: O, T==1)

지정된 소켓에 대한 기본 서비스 공급자 핸들을 검색합니다. 반환된 값은 SOCKET입니다.

반환 값은 기본 서비스 공급자의 소켓 핸들이어야 하므로 계층화된 서비스 공급자는 이 IOCTL을 가로채서는 안 됩니다.

출력 버퍼가 소켓 핸들에 충분히 크지 않거나( cbOutBufferSOCKET 크기보다 작음) lpvOutBuffer 매개 변수가 NULL 포인터인 경우 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastErrorWSAEFAULT를 반환합니다.

SIO_BASE_HANDLEMswsock.h 헤더 파일에 정의되며 Windows Vista 이상에서 지원됩니다.

SIO_BSP_HANDLE (opcode 설정: O, T==1)

WSASendMsg 함수에서 사용하는 소켓에 대한 기본 서비스 공급자 핸들을 검색합니다. 반환된 값은 SOCKET입니다.

이 Ioctl은 계층화된 서비스 공급자가 공급자가 WSASendMsg 함수를 가로채도록 하는 데 사용됩니다.

출력 버퍼가 소켓 핸들에 충분히 크지 않거나( cbOutBufferSOCKET 크기보다 작음) lpvOutBuffer 매개 변수가 NULL 포인터인 경우 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastErrorWSAEFAULT를 반환합니다.

SIO_BSP_HANDLEMswsock.h 헤더 파일에 정의되며 Windows Vista 이상에서 지원됩니다.

SIO_BSP_HANDLE_SELECT (opcode 설정: O, T==1)

select 함수에서 사용하는 소켓에 대한 기본 서비스 공급자 핸들을 검색 합니다. 반환된 값은 SOCKET입니다.

이 Ioctl은 계층화된 서비스 공급자가 공급자가 select 함수를 가로채도록 하는 데 사용됩니다.

출력 버퍼가 소켓 핸들에 충분히 크지 않거나( cbOutBufferSOCKET 크기보다 작음) lpvOutBuffer 매개 변수가 NULL 포인터인 경우 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastErrorWSAEFAULT를 반환합니다.

SIO_BSP_HANDLE_SELECTMswsock.h 헤더 파일에 정의되고 Windows Vista 이상에서 지원됩니다.

SIO_BSP_HANDLE_POLL (opcode 설정: O, T==1)

WSAPoll 함수에서 사용하는 소켓에 대한 기본 서비스 공급자 핸들을 검색합니다. lpOverlapped 매개 변수는 NULL 포인터여야 합니다. 반환된 값은 SOCKET입니다.

이 Ioctl은 계층화된 서비스 공급자가 공급자가 WSAPoll 함수를 가로채도록 하는 데 사용됩니다.

출력 버퍼가 소켓 핸들에 충분히 크지 않은 경우( cbOutBufferSOCKET 크기보다 작음), lpvOutBuffer 매개 변수가 NULL 포인터이거나 lpOverlapped 매개 변수가 NULL 포인터가 아닌 경우 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastErrorWSAEFAULT를 반환합니다.

SIO_BSP_HANDLE_POLLMswsock.h 헤더 파일에 정의되며 Windows Vista 이상에서 지원됩니다.

SIO_CHK_QOS (opcode 설정: I, O, T==3)

QoS 트래픽 특성에 대한 정보를 검색합니다. 흐름 설정과 RESV 메시지 수신 간의 전송 시스템에 대한 전환 단계(전환 단계에 대한 자세한 내용은 RSVP 서비스가 TC를 호출하는 방법 참조)에서 RSVP 흐름과 연결된 트래픽은 서비스 유형(BEST EFFORT, 제어된 LOAD 또는 GUARANTEED)에 따라 형성됩니다. 자세한 내용은 SDK(플랫폼 소프트웨어 개발 키트)의 서비스 품질 섹션에서 SIO_CHK_QOS 사용을 참조하세요.

SIO_ENABLE_CIRCULAR_QUEUEING (opcode 설정: V, T==1)

버퍼 큐 오버플로로 인해 새로 도착한 메시지를 삭제해서는 안 됨을 메시지 지향 서비스 공급자에게 나타냅니다. 대신 새로 도착한 메시지를 수용하기 위해 큐에서 가장 오래된 메시지를 제거해야 합니다. 입력 및 출력 버퍼가 필요하지 않습니다. 이 IOCTL은 신뢰할 수 없는 메시지 지향 프로토콜과 연결된 소켓에 대해서만 유효합니다. WSAENOPROTOOPT 오류 코드는 이 IOCTL을 지원하지 않는 서비스 공급자에 대해 표시됩니다.

SIO_FIND_ROUTE (opcode 설정: O, T==1)

발급되면 이 IOCTL은 입력 버퍼에서 sockaddr 로 지정된 원격 주소로의 경로를 검색하도록 요청합니다. 주소가 로컬 캐시에 이미 있는 경우 해당 항목이 무효화됩니다. Novell의 IPX의 경우 이 호출은 지정된 원격 주소에 대해 네트워크를 쿼리하는 IPX GLT(GetLocalTarget)를 시작합니다.

SIO_FLUSH (opcode 설정: V, T==1)

이 소켓과 연결된 전송 큐의 현재 콘텐츠를 삭제합니다. 입력 및 출력 버퍼가 필요하지 않습니다. WSAENOPROTOOPT 오류 코드는 이 IOCTL을 지원하지 않는 서비스 공급자에 대해 표시됩니다.

SIO_GET_BROADCAST_ADDRESS (opcode 설정: O, T==1)

이 IOCTL은 출력 버퍼를 LPWSPSendTo와 함께 사용하기에 적합한 브로드캐스트 주소를 포함하는 sockaddr 구조로 채웁니다.

SIO_GET_EXTENSION_FUNCTION_POINTER (opcode 설정: O, I, T==1)

연결된 서비스 공급자가 지원하는 지정된 확장 함수에 대한 포인터를 검색합니다. 입력 버퍼에는 해당 확장 함수를 식별하는 값이 있는 GUID(Globally Unique Identifier)가 포함되어 있습니다. 원하는 함수에 대한 포인터가 출력 버퍼에 반환됩니다. 확장 함수 식별자는 서비스 공급자 공급업체에 의해 설정되며 확장 함수 기능 및 의미 체계를 설명하는 공급업체 설명서에 포함되어야 합니다.

Windows TCP/IP 서비스 공급자가 지원하는 확장 함수의 GUID 값은 Mswsock.h 헤더 파일에 정의되어 있습니다. 이러한 GUID의 가능한 값은 다음과 같습니다.

용어 설명
WSAID_ACCEPTEX
AcceptEx 확장 함수입니다.
WSAID_CONNECTEX
ConnectEx 확장 함수입니다.
WSAID_DISCONNECTEX
DisconnectEx 확장 함수입니다.
WSAID_GETACCEPTEXSOCKADDRS
GetAcceptExSockaddrs 확장 함수입니다.
WSAID_TRANSMITFILE
TransmitFile 확장 함수입니다.
WSAID_TRANSMITPACKETS
TransmitPackets 확장 함수입니다.
WSAID_WSARECVMSG
LPFN_WSARECVMSG(WSARecvMsg) 확장 함수입니다.
WSAID_WSASENDMSG
WSASendMsg 확장 함수입니다.

 

SIO_GET_GROUP_QOS (opcode 설정: O, T==1)

예약되어 있습니다.

SIO_GET_INTERFACE_LIST (opcode 설정: O, T==0)

구성된 IP 인터페이스 및 해당 매개 변수 목록을 INTERFACE_INFO 구조의 배열로 반환합니다.

참고

이 명령의 지원은 Windows 소켓 2 규격 TCP/IP 서비스 공급자에 대해 필수입니다.

 

lpvOutBuffer 매개 변수는 인터페이스에 대한 정보를 인터페이스의 유니캐스트 IP 주소에 대한 INTERFACE_INFO 구조의 배열로 저장할 버퍼를 가리킵니다. cbOutBuffer 매개 변수는 출력 버퍼의 길이를 지정합니다. 반환된 인터페이스 수( lpvOutBuffer 매개 변수가 가리키는 버퍼에서 반환된 구조체 수)는 lpcbBytesReturned 매개 변수에서 반환된 출력 버퍼의 실제 길이에 따라 확인할 수 있습니다.

WSAIoctl 함수가 SIO_GET_INTERFACE_LIST 사용하여 호출되고 소켓 매개 변수 수준 멤버가 IPPROTO_IP 정의되지 않은 경우 WSAEINVAL이 반환됩니다. 출력 버퍼의 길이를 지정하는 cbOutBuffer 매개 변수가 너무 작아서 구성된 인터페이스 목록을 수신하면 SIO_GET_INTERFACE_LISTWSAIoctl 함수를 호출하면 WSAEFAULT가 반환됩니다.

SIO_GET_INTERFACE_LIST_EX (opcode 설정: O, T==0)

나중에 소켓과 함께 사용할 수 있습니다.

구성된 IP 인터페이스 및 해당 매개 변수 목록을 INTERFACE_INFO_EX 구조의 배열로 반환합니다.

lpvOutBuffer 매개 변수는 인터페이스에 대한 정보를 인터페이스의 유니캐스트 IP 주소에 대한 INTERFACE_INFO_EX 구조의 배열로 저장할 버퍼를 가리킵니다. cbOutBuffer 매개 변수는 출력 버퍼의 길이를 지정합니다. lpcbBytesReturned 매개 변수에 반환된 출력 버퍼의 실제 길이에 따라 반환된 인터페이스 수(lpvOutBuffer에서 반환된 구조 수)를 확인할 수 있습니다.

SIO_GET_INTERFACE_LIST_EX 현재 Windows에서 지원되지 않습니다.

SIO_GET_QOS (opcode 설정: O, T==1)

소켓과 연결된 QOS 구조를 검색합니다. 입력 버퍼는 선택 사항입니다. 일부 프로토콜(예: RSVP)을 사용하면 입력 버퍼를 사용하여 QOS 요청을 한정할 수 있습니다. QOS 구조는 출력 버퍼에 복사됩니다. 출력 버퍼의 크기는 전체 QOS 구조를 포함할 수 있을 만큼 커야 합니다. WSAENOPROTOOPT 오류 코드는 서비스 품질을 지원하지 않는 서비스 공급자에 대해 표시됩니다.

SIO_IDEAL_SEND_BACKLOG_CHANGE (opcode 설정: V, T==0)

기본 연결에 대한 이상적인 ISB(보내기 백로그) 값이 변경되면 애플리케이션에 알릴 수 있습니다.

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

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

자세한 내용은 SIO_IDEAL_SEND_BACKLOG_CHANGE 참조를 참조하세요.

SIO_IDEAL_SEND_BACKLOG_CHANGE Windows Server 2008, WINDOWS Vista SP1 이상 버전의 운영 체제에서 지원됩니다.

SIO_IDEAL_SEND_BACKLOG_QUERY (opcode 설정: O, T==0)

기본 연결에 대한 이상적인 ISB(보내기 백로그) 값을 검색합니다.

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

연결당 ISB 값은 Windows Server 2008 이상의 TCP 프로토콜 구현에서 사용할 수 있습니다. SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL은 애플리케이션에서 연결에 대한 ISB 값을 쿼리하는 데 사용할 수 있습니다.

자세한 내용은 SIO_IDEAL_SEND_BACKLOG_QUERY 참조를 참조하세요.

SIO_IDEAL_SEND_BACKLOG_QUERY Windows Server 2008, WINDOWS Vista SP1 이상 버전의 운영 체제에서 지원됩니다.

SIO_KEEPALIVE_VALS (opcode 설정: I, T==3)

TCP keep-alive 시간 제한 및 간격을 지정하는 TCP keep-alive 옵션의 연결별 설정을 사용하거나 사용하지 않도록 설정합니다. 연결 유지 옵션에 대한 자세한 내용은 IETF 웹 사이트에서 사용할 수 있는 RFC 1122에 지정된 통신 계층인 인터넷 호스트에 대한 요구 사항의 섹션 4.2.3.6을 참조하세요.

SIO_KEEPALIVE_VALS 사용하여 활성 유지 프로브를 사용하거나 사용하지 않도록 설정하고 유지 유지 시간 제한 및 간격을 설정할 수 있습니다. keep-alive 시간 제한은 첫 번째 keep-alive 패킷이 전송될 때까지 활동 없이 시간 제한(밀리초)을 지정합니다. keep-alive 간격은 승인이 수신되지 않은 경우 연속된 keep-alive 패킷이 전송되는 간격(밀리초)을 지정합니다.

SOL_SOCKET 소켓 옵션 중 하나인 SO_KEEPALIVE 옵션을 사용하여 연결에서 TCP 유지를 사용하거나 사용하지 않도록 설정하고 이 옵션의 현재 상태를 쿼리할 수도 있습니다. 소켓에서 TCP keep-alive를 사용할 수 있는지 여부를 쿼리하기 위해 SO_KEEPALIVE 옵션을 사용하여 getsockopt 함수를 호출할 수 있습니다. TCP keep-alive를 사용하거나 사용하지 않도록 설정하려면 SO_KEEPALIVE 옵션을 사용하여 setsockopt 함수를 호출할 수 있습니다. SO_KEEPALIVE TCP keep-alive를 사용하도록 설정한 경우 이러한 값이 SIO_KEEPALIVE_VALS사용하여 변경되지 않는 한 기본 TCP 설정은 유지 시간 제한 및 간격에 사용됩니다.

자세한 내용은 SIO_KEEPALIVE_VALS 참조를 참조하세요. SIO_KEEPALIVE_VALS Windows 2000 이상에서 지원됩니다.

SIO_MULTIPOINT_LOOPBACK (opcode 설정: I, T==1)

멀티캐스트 세션의 로컬 컴퓨터(반드시 동일한 소켓이 아님)에서 애플리케이션에서 보낸 데이터를 루프백 인터페이스의 멀티캐스트 대상 그룹에 조인된 소켓에서 수신할지 여부를 제어합니다. TRUE 값을 지정하면 로컬 컴퓨터의 애플리케이션에서 보낸 멀티캐스트 데이터가 루프백 인터페이스의 수신 대기 소켓으로 전달됩니다. FALSE 값을 사용하면 로컬 컴퓨터의 애플리케이션에서 보낸 멀티캐스트 데이터가 루프백 인터페이스의 수신 대기 소켓으로 배달되지 않습니다. 기본적으로 SIO_MULTIPOINT_LOOPBACK 사용하도록 설정됩니다.

SIO_MULTICAST_SCOPE (opcode 설정: I, T==1)

멀티캐스트 전송이 발생할 scope 지정합니다. 범위는 다룰 라우트된 네트워크 세그먼트 수로 정의됩니다. scope 0이면 멀티캐스트 전송이 유선에 배치되지 않지만 로컬 호스트 내의 소켓에 전파될 수 있음을 나타냅니다. scope 값 1(기본값)은 전송이 유선에 배치되지만 라우터를 교차하지 않음을 나타냅니다. scope 값이 높을수록 교차할 수 있는 라우터 수가 결정됩니다. 이는 IP 멀티캐스팅의 TTL(Time to Live) 매개 변수에 해당합니다.

SIO_QUERY_RSS_SCALABILITY_INFO (opcode 설정: O, T==3)

RSS(수신측 크기 조정) 기능을 위한 오프로드 인터페이스를 쿼리합니다. SIO_QUERY_RSS_SCALABILITY_INFO 대해 반환된 인수 구조체는 Mstcpip.h 헤더 파일에 정의된 RSS_SCALABILITY_INFO 구조체에 지정됩니다. 이 구조체는 다음과 같이 정의됩니다.

void CALLBACK 
CompletionRoutine(  
  IN DWORD           dwError, 
  IN DWORD           cbTransferred, 
  IN LPWSAOVERLAPPED lpOverlapped, 
  IN DWORD           dwFlags 
);

RssEnabled 멤버에 반환된 값은 하나 이상의 인터페이스에서 RSS가 사용하도록 설정되어 있는지를 나타냅니다.

출력 버퍼가 RSS_SCALABILITY_INFO 구조체에 충분히 크지 않거나( cbOutBufferRSS_SCALABILITY_INFO 크기보다 작음) lpvOutBuffer 매개 변수가 NULL 포인터인 경우 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastErrorWSAEINVAL을 반환합니다.

단일 시스템 내에 여러 CPU가 있는 고속 네트워킹에서는 NDIS 5.1 이전 버전 제한의 아키텍처가 프로토콜 처리를 단일 CPU로 수신하기 때문에 네트워킹 프로토콜 스택이 다중 CPU 시스템에서 잘 스케일링되는 기능이 억제됩니다. RSS(수신측 크기 조정)는 네트워크 어댑터의 네트워크 부하를 여러 CPU 간에 분산할 수 있도록 하여 이 문제를 해결합니다.

SIO_QUERY_RSS_SCALABILITY_INFO Windows Vista 이상에서 지원됩니다.

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE (opcode 설정: O, T==3)

ALE(애플리케이션 계층 적용) 엔드포인트 핸들을 쿼리합니다.

Windows WFP(필터링 플랫폼)는 네트워크 트래픽 검사 및 수정을 지원합니다. Windows Vista에서 WFP는 호스트 컴퓨터가 통신 엔드포인트인 시나리오에 중점을 둡니다. 그러나 Windows Server 2008에는 WFP 플랫폼을 활용하여 통과 트래픽을 검사하고 프록시하려는 에지 방화벽 구현이 있습니다. ISA(인터넷 보안 및 가속) 서버는 이러한 에지 디바이스의 예입니다.

기존 엔드포인트와 연결된 송신 경로에 인바운드 패킷을 삽입하는 기능이 필요할 수 있는 몇 가지 방화벽 시나리오가 있습니다. 대상 엔드포인트와 연결된 전송 계층 엔드포인트 핸들을 검색하는 메커니즘이 있어야 합니다. 엔드포인트를 만든 애플리케이션은 이러한 전송 계층 엔드포인트를 소유합니다. 이 IOCTL은 전송 계층 엔드포인트 핸들 매핑에 소켓 핸들을 제공하는 데 사용됩니다.

출력 버퍼가 엔드포인트 핸들에 충분히 크지 않거나( cbOutBufferUINT64의 크기보다 작음) lpvOutBuffer 매개 변수가 NULL 포인터인 경우 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastErrorWSAEINVAL을 반환합니다.

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE Windows Vista 이상에서 지원됩니다.

SIO_QUERY_PNP_TARGET_HANDLE (opcode 설정: O, T==1)

현재 소켓이 PnP 센스에 의존하는 체인에서 다음 공급자의 소켓 설명자를 가져오려면 이 IOCTL은 WPUCreateSocketHandle 호출을 통해 만든 비 IFS 서비스 공급자의 소켓에서만 Windows 소켓 2 DLL에 의해 호출됩니다. 공급자는 출력 버퍼에서 지정된 소켓 핸들이 PnP 의미에서 의존하는 체인의 다음 공급자의 소켓 핸들을 반환해야 합니다(예: 기본 핸들을 지원하는 디바이스를 제거하면 체인에서 위의 핸들이 무효화됩니다).

겹치는 작업이 즉시 완료되면 이 함수는 값을 0으로 반환하고 lpcbBytesReturned 매개 변수는 출력 버퍼의 바이트 수로 업데이트됩니다. 겹치는 작업이 성공적으로 시작되고 나중에 완료될 경우 이 함수는 SOCKET_ERROR 반환하고 오류 코드 WSA_IO_PENDING 나타냅니다. 이 경우 lpcbBytesReturned 은 업데이트되지 않습니다. 겹치는 작업이 완료되면 출력 버퍼의 데이터 양은 완료 루틴의 cbTransferred 매개 변수(지정된 경우)를 통해 또는 LPWSPGetOverlappedResultlpcbTransfer 매개 변수를 통해 표시됩니다.

SIO_RCVALL (opcode 설정: I, T==3)

소켓이 네트워크 인터페이스를 통과하는 모든 IPv4 또는 IPv6 패킷을 수신할 수 있도록 합니다. WSAIoctl 함수에 전달된 소켓 핸들은 다음 중 하나여야 합니다.

  • 주소 패밀리가 AF_INET 설정되고, 소켓 유형이 SOCK_RAW 설정되고, 프로토콜이 IPPROTO_IP 설정된 IPv4 소켓입니다.
  • 주소 패밀리가 AF_INET6 설정되고, 소켓 유형이 SOCK_RAW 설정되고, 프로토콜이 IPPROTO_IPV6 설정된 IPv6 소켓입니다.

또한 소켓은 명시적 로컬 IPv4 또는 IPv6 인터페이스에 바인딩되어야 합니다. 즉, INADDR_ANY 또는 in6addr_any 바인딩할 수 없습니다.

Windows Server 2008 및 이전 버전에서는 SIO_RCVALL IOCTL 설정이 네트워크 인터페이스에서 전송된 로컬 패킷을 캡처하지 않습니다. 여기에는 다른 인터페이스에서 수신되고 SIO_RCVALL IOCTL에 지정된 네트워크 인터페이스를 전달한 패킷이 포함되었습니다.

Windows 7 및 Windows Server 2008 R2에서는 네트워크 인터페이스에서 전송된 로컬 패킷도 캡처되도록 변경되었습니다. 여기에는 다른 인터페이스에서 수신한 다음 SIO_RCVALL IOCTL을 사용하여 소켓에 바인딩된 네트워크 인터페이스를 전달한 패킷이 포함됩니다.

이 IOCTL을 설정하려면 로컬 컴퓨터에 대한 관리자 권한이 필요합니다.

이 기능을 난잡한 모드라고도 합니다.

SIO_RCVALL IOCTL 옵션에 사용할 수 있는 값은 Mstcpip.h 헤더 파일에 정의된 RCVALL_VALUE 열거형에 지정됩니다. SIO_RCVALL 가능한 값은 다음과 같습니다.

용어 설명
RCVALL_OFF
소켓이 네트워크의 모든 IPv4 또는 IPv6 패킷을 수신하지 않도록 이 옵션을 사용하지 않도록 설정합니다.
RCVALL_ON
소켓이 네트워크의 모든 IPv4 또는 IPv6 패킷을 수신하도록 이 옵션을 사용하도록 설정합니다. 이 옵션은 NIC가 무차별 모드를 지원하는 경우 NIC(네트워크 인터페이스 카드)에서 무차별 모드를 사용하도록 설정합니다. 네트워크 허브가 있는 LAN 세그먼트에서 무차별 모드를 지원하는 NIC는 동일한 LAN 세그먼트의 다른 컴퓨터 간 트래픽을 포함하여 LAN의 모든 IPv4 또는 IPv6 트래픽을 캡처합니다. 캡처된 모든 패킷(소켓에 따라 IPv4 또는 IPv6)이 원시 소켓으로 전달됩니다.
이 옵션은 인터페이스에서 다른 패킷(예: ARP, IPX 및 NetBEUI 패킷)을 캡처하지 않습니다.
Netmon은 네트워크 인터페이스에 대해 동일한 모드를 사용하지만 트래픽을 캡처하는 데는 이 옵션을 사용하지 않습니다.
RCVALL_SOCKETLEVELONLY
이 기능은 현재 구현되지 않으므로 이 옵션을 설정해도 영향을 주지 않습니다.
RCVALL_IPLEVEL
IPv4 또는 IPv6 소켓이 네트워크의 IP 수준에서 모든 패킷을 수신하도록 이 옵션을 사용하도록 설정합니다. 이 옵션은 네트워크 인터페이스 카드 난잡한 모드를 사용하도록 설정하지 않습니다. 이 옵션은 IP 수준의 패킷 처리에만 영향을 줍니다. NIC는 구성된 유니캐스트 및 멀티캐스트 주소로 전달되는 패킷만 계속 받습니다. 그러나 이 옵션을 사용하도록 설정된 소켓은 특정 IP 주소로 전달되는 패킷뿐만 아니라 NIC가 수신하는 모든 IPv4 또는 IPv6 패킷을 수신합니다.
이 옵션은 인터페이스에서 받은 다른 패킷(예: ARP, IPX 및 NetBEUI 패킷)을 캡처하지 않습니다.

자세한 내용은 SIO_RCVALL 참조를 참조하세요.

SIO_RCVALL Windows 2000 이상에서 지원됩니다.

SIO_RELEASE_PORT_RESERVATION (opcode 설정: I, T==3)

TCP 또는 UDP 포트 블록에 대한 런타임 예약을 해제합니다. 해제할 런타임 예약은 SIO_ACQUIRE_PORT_RESERVATION IOCTL을 사용하여 발급 프로세스에서 가져와야 합니다.

자세한 내용은 SIO_RELEASE_PORT_RESERVATION 참조를 참조하세요.

SIO_RELEASE_PORT_RESERVATION Windows Vista 이상 버전의 운영 체제에서 지원됩니다.

SIO_ROUTING_INTERFACE_CHANGE (opcode 설정: I, T==1)

입력 버퍼의 원격 주소에 도달하는 데 사용해야 하는 라우팅 인터페이스 변경 알림을 받으려면( sockaddr 구조로 지정됨) 이 IOCTL이 완료되면 새 라우팅 인터페이스에 대한 출력 정보가 제공되지 않습니다. 완료는 지정된 대상에 대한 라우팅 인터페이스가 변경되었으며 SIO_ROUTING_INTERFACE_QUERY IOCTL을 사용하여 쿼리되어야 했음을 나타냅니다.

애플리케이션이 겹치는 I/O를 사용하여 SIO_ROUTING_INTERFACE_CHANGE 요청 완료를 통해 라우팅 인터페이스 변경에 대한 알림을 받도록 가정합니다(필수는 아님). 또는 lpOverlapped 및 lpCompletionRoutine 매개 변수가 NULL로 설정된 비차단 소켓에서 SIO_ROUTING_INTERFACE_CHANGE IOCTL이 실행되면 WSAEWOULDBLOCK 오류와 함께 즉시 완료됩니다. 그런 다음 Windows 소켓 SPI 클라이언트는 네트워크 이벤트 비트 마스크에 설정된 FD_ROUTING_INTERFACE_CHANGE 비트가 있는 LPWSPEventSelect 또는 LPWSPAsyncSelect에 대한 호출을 사용하여 라우팅 변경 이벤트를 기다릴 수 있습니다.

라우팅 정보는 대부분의 경우 안정적으로 유지되므로 애플리케이션이 관심 있는 모든 대상에 대한 알림을 받기 위해 여러 미해결 IOCTL을 유지하도록 요구하고 서비스 공급자가 이러한 알림 요청을 추적하도록 하면 상당한 양의 시스템 리소스를 사용합니다. 입력 매개 변수의 의미를 확장하고 다음과 같이 서비스 공급자 요구 사항을 완화하여 이러한 상황을 방지할 수 있습니다.

Windows 소켓 SPI 클라이언트는 프로토콜 패밀리별 와일드카드 주소(사용 가능한 주소에 바인딩을 요청할 때 바인딩 호출에 사용되는 주소와 동일)를 지정하여 라우팅 변경에 대한 알림을 요청할 수 있습니다. 이렇게 하면 Windows Sockets SPI 클라이언트가 있는 모든 소켓 및 대상에 대해 하나의 미해결 SIO_ROUTING_INTERFACE_CHANGE 유지한 다음 , SIO_ROUTING_INTERFACE_QUERY 사용하여 실제 라우팅 정보를 가져올 수 있습니다.

서비스 공급자는 SIO_ROUTING_INTERFACE_CHANGE 입력 버퍼에서 Windows Sockets SPI 클라이언트가 제공한 정보를 무시하고(Windows Sockets SPI 클라이언트가 와일드카드 주소를 지정한 것처럼) 라우팅 정보가 변경될 경우(입력 버퍼에 지정된 대상에 대한 경로뿐만 아니라) SIO_ROUTING_INTERFACE_CHANGE IOCTL 또는 신호 FD_ROUTING_INTERFACE_CHANGE 이벤트를 완료하도록 선택할 수 있습니다.

SIO_ROUTING_INTERFACE_QUERY (opcode 설정: I, O, T==1)

입력 버퍼에 지정된 원격 주소( sockaddr 로)로 보내는 데 사용해야 하는 로컬 인터페이스( sockaddr 구조체로 표시)의 주소를 가져오려면 멀티캐스트 전송을 위한 기본 인터페이스의 주소를 가져오기 위해 입력 버퍼에 원격 멀티캐스트 주소를 제출할 수 있습니다. 어떤 경우든 반환된 인터페이스 주소는 애플리케이션이 후속 Bind 요청에서 사용할 수 있습니다.

경로는 변경될 수 있습니다. 따라서 Windows 소켓 SPI 클라이언트는 SIO_ROUTING_INTERFACE_QUERY 반환된 정보를 영구적으로 사용할 수 없습니다. SPI 클라이언트는 겹치는 I/O 또는 FD_ROUTING_INTERFACE_CHANGE 이벤트를 통해 알림을 제공하는 SIO_ROUTING_INTERFACE_CHANGE IOCTL을 사용하여 라우팅 변경 알림을 등록할 수 있습니다. 다음 작업 시퀀스를 사용하여 Windows 소켓 SPI 클라이언트에 지정된 대상에 대한 현재 라우팅 인터페이스 정보가 항상 있음을 보장할 수 있습니다.

  • IOCTL 에 SIO_ROUTING_INTERFACE_CHANGE 문제.
  • IOCTL 에 SIO_ROUTING_INTERFACE_QUERY 문제.
  • SIO_ROUTING_INTERFACE_CHANGE IOCTL이 WinSock SPI 클라이언트에 라우팅 변경(겹치는 I/O를 통해 또는 FD_ROUTING_INTERFACE_CHANGE 이벤트 신호를 통해)을 알릴 때마다 전체 작업 순서를 반복해야 합니다.

출력 버퍼가 인터페이스 주소를 포함할 만큼 크지 않으면 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastErrorWSAEFAULT를 반환합니다. 이 경우 출력 버퍼의 필요한 크기가 lpcbBytesRe로 반환됩니다. lpvInBuffer, lpvOutBuffer 또는 lpcbBytesReturned 매개 변수가 사용자 주소 공간의 유효한 부분에 완전히 포함되지 않은 경우에도 WSAEFAULT 오류 코드가 반환됩니다.

입력 버퍼에 지정된 대상 주소가 사용 가능한 인터페이스를 통해 연결할 수 없는 경우 이 IOCTL의 결과로 SOCKET_ERROR 반환되고 WSAGetLastError 는 모든 네트워크 연결이 끊어지면 WSAENETUNREACH 또는 WSAENETDOWN 을 반환합니다.

SIO_SET_COMPATIBILITY_MODE (opcode 설정: I, T==3)

네트워킹 스택이 Windows 버전에서 동작을 처리하는 기본 방법이 다를 수 있는 특정 동작을 처리하는 방법을 요청합니다. SIO_SET_COMPATIBILITY_MODE 인수 구조체는 Mswsockdef.h 헤더 파일에 정의된 WSA_COMPATIBILITY_MODE 구조체에 지정됩니다. 이 구조체는 다음과 같이 정의됩니다.

} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

BehaviorId 멤버에 지정된 값은 요청된 동작을 나타냅니다. TargetOsVersion 멤버에 지정된 값은 동작에 대해 요청되는 Windows 버전을 나타냅니다.

BehaviorId 멤버는 Mswsockdef.h 헤더 파일에 정의된 WSA_COMPATIBILITY_BEHAVIOR_ID 열거형 형식의 값 중 하나일 수 있습니다. BehaviorId 멤버의 가능한 값은 다음과 같습니다.

용어 설명
WsaBehaviorAll
이는 WSA_COMPATIBILITY_BEHAVIOR_ID 대해 정의된 가능한 모든 호환 동작을 요청하는 것과 같습니다.
WsaBehaviorReceiveBuffering
TargetOsVersion 멤버가 Windows Vista 이상의 값으로 설정된 경우 TCP 연결이 설정된 후에도 SO_RCVBUF 소켓 옵션을 사용하여 이 소켓의 TCP 수신 버퍼 크기 축소가 허용됩니다.
TargetOsVersion 멤버가 Windows Vista보다 이전 값으로 설정된 경우 연결 설정 후 SO_RCVBUF 소켓 옵션을 사용하여 이 소켓에서 TCP 수신 버퍼 크기로 축소할 수 없습니다.
WsaBehaviorAutoTuning
TargetOsVersion 멤버를 Windows Vista 이상의 값으로 설정하면 수신 창 자동 조정이 사용하도록 설정되고 TCP 창 배율 인수가 기본값 8에서 2로 줄어듭니다.
TargetOsVersion을 Windows Vista 이전 값으로 설정하면 수신 창 자동 튜닝이 비활성화됩니다. TCP 창 크기 조정 옵션도 사용하지 않도록 설정되며 최대 실제 수신 창 크기는 65,535바이트로 제한됩니다. 연결이 설정되기 전에 65,535바이트보다 큰 값을 지정하는 이 소켓에서 SO_RCVBUF 소켓 옵션을 호출한 경우에도 연결에서 TCP 창 크기 조정 옵션을 협상할 수 없습니다.

 

자세한 내용은 SIO_SET_COMPATIBILITY_MODE 참조를 참조하세요.

SIO_SET_COMPATIBILITY_MODE Windows Vista 이상에서 지원됩니다.

SIO_SET_GROUP_QOS (opcode 설정: I, T==1)

예약되어 있습니다.

SIO_SET_QOS (opcode 설정: I, T==1)

제공된 QOS 구조를 소켓과 연결합니다. 출력 버퍼가 필요하지 않습니다. QOS 구조는 입력 버퍼에서 가져옵니다. WSAENOPROTOOPT 오류 코드는 서비스 품질을 지원하지 않는 서비스 공급자에 대해 표시됩니다.

SIO_TRANSLATE_HANDLE (opcode 설정: I, O, T==1)

도우미 인터페이스의 컨텍스트에서 유효한 소켓 s 에 대한 해당 핸들을 가져오려면(예: TH_NETDEV 및 TH_TAPI). 다른 필요한 매개 변수와 함께 도우미 인터페이스를 식별하는 매니페스트 상수가 입력 버퍼에 지정됩니다. 해당 핸들은 이 함수가 완료되면 출력 버퍼에서 사용할 수 있습니다. 자세한 내용은 Windows 소켓 2 Protocol-Specific 부속서 및/또는 설명서의 해당 섹션을 참조하세요. WSAENOPROTOOPT 오류 코드는 지정된 도우미 인터페이스에 대해 이 IOCTL을 지원하지 않는 서비스 공급자에 대해 표시됩니다. 이 IOCTL은 SIO_TRANSLATE_HANDLE 사용하여 연결된 핸들을 검색합니다.

이 IOCTL 대신 COM을 사용하여 소켓에서 지원될 수 있는 다른 인터페이스를 검색하고 추적하는 것이 좋습니다. 이 IOCTL은 COM을 사용할 수 없거나 다른 이유로 사용할 수 없는 시스템과의 이전 버전과의 호환성을 위해 존재합니다.

SIO_UDP_CONNRESET (opcode 설정: I, T==3)

Windows XP: UDP PORT_UNREACHABLE 메시지가 보고되는지 여부를 제어합니다. 보고를 사용하도록 설정하려면 TRUE 로 설정합니다. 보고를 사용하지 않도록 설정하려면 FALSE 로 설정합니다.

겹치는 소켓을 사용하여 호출하는 경우 lpOverlapped 매개 변수는 겹치는 작업 기간 동안 유효해야 합니다.

lpCompletionRoutine 매개 변수가 NULL인 경우 서비스 공급자는 유효한 이벤트 개체 핸들이 포함된 경우 겹치는 작업이 완료되면 lpOverlappedhEvent 멤버에 신호를 보냅니다. Windows 소켓 SPI 클라이언트는 LPWSPGetOverlappedResult 를 사용하여 이벤트 개체를 폴링하거나 대기할 수 있습니다.

lpCompletionRoutineNULL이 아닌 경우 hEvent 멤버는 무시되며 Windows 소켓 SPI 클라이언트에서 컨텍스트 정보를 완료 루틴에 전달하는 데 사용할 수 있습니다. NULL이 아닌 lpCompletionRoutine을 전달하고 나중에 동일한 겹치는 I/O 요청에 대해 WSAGetOverlappedResult를 호출하는 클라이언트는 WSAGetOverlappedResult 호출에 대한 fWait 매개 변수를 TRUE로 설정하지 않을 수 있습니다. 이 경우 hEvent 멤버의 사용이 정의되지 않았으며 hEvent 멤버를 기다리려고 하면 예측할 수 없는 결과가 생성됩니다.

겹치는 작업이 완료될 때 지정된 클라이언트 호출-완료 루틴을 정렬하는 것은 서비스 공급자의 책임입니다. 겹치는 작업을 시작한 동일한 스레드의 컨텍스트에서 완료 루틴을 실행해야 하므로 서비스 공급자에서 직접 호출할 수 없습니다. 이 WS2_32.DLL 완료 루틴을 쉽게 호출할 수 있도록 APC(비동기 프로시저 호출) 메커니즘을 제공합니다.

서비스 공급자는 WPUQueueApc를 호출하여 적절한 스레드 및 프로세스 컨텍스트에서 함수를 실행하도록 정렬합니다. 이 함수는 겹치는 작업을 시작하는 데 사용된 스레드 및 프로세스와 다른 컨텍스트라도 모든 프로세스 및 스레드 컨텍스트에서 호출할 수 있습니다.

WPUQueueApcWSATHREADID 구조체에 대한 포인터( lpThreadId 입력 매개 변수를 통해 공급자에게 제공됨), 호출할 APC 함수에 대한 포인터 및 이후에 APC 함수에 전달되는 32비트 컨텍스트 값을 입력 매개 변수로 사용합니다. 단일 32비트 컨텍스트 값만 사용할 수 있으므로 APC 함수 자체는 클라이언트가 지정한 완료 루틴일 수 없습니다. 대신 서비스 공급자는 제공된 컨텍스트 값을 사용하여 겹치는 작업에 필요한 결과 정보에 액세스하는 자체 APC 함수에 대한 포인터를 제공한 다음 지정된 클라이언트 완료 루틴을 호출해야 합니다.

클라이언트에서 제공하는 완료 루틴의 프로토타입은 다음과 같습니다.

);

CompletionRoutine 은 클라이언트 제공 함수의 자리 표시자입니다. dwErrorlpOverlapped로 표시된 대로 겹치는 작업에 대한 완료 상태 지정합니다. cbTransferred는 반환되는 바이트 수를 지정합니다. 현재는 플래그 값이 정의되어 있지 않으며 dwFlags는 0이 됩니다. 이 함수는 값을 반환하지 않습니다.

이 함수에서 반환하면 이 소켓에 대해 보류 중인 다른 완료 루틴을 호출할 수 있습니다. 완료 루틴은 겹치는 작업이 완료된 순서와 동일한 순서로 반드시 호출되지는 않지만 모든 순서로 호출할 수 있습니다.

호환성

T == 0이 있는 IOCTL 코드는 버클리 소켓에서 사용되는 IOCTL 코드의 하위 집합입니다. 특히 FIOASYNC와 동일한 명령은 없습니다.

참고

지정된 스레드에서 시작한 모든 I/O는 해당 스레드가 종료될 때 취소됩니다. 겹치는 소켓의 경우 작업이 완료되기 전에 스레드가 닫히면 보류 중인 비동기 작업이 실패할 수 있습니다. 자세한 내용은 ExitThread 를 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
머리글 ws2spi.h

참고 항목

WPUQueueApc

LPWSPGetSockopt

LPWSPSetSockOpt

LPWSPSocket