다음을 통해 공유


ADDRINFOEX4 구조체(ws2def.h)

addrinfoex4 구조체는 특정 네트워크 인터페이스가 요청되었을 때 GetAddrInfoEx 함수에서 호스트 주소 정보를 보유하는 데 사용됩니다.

구문

typedef struct addrinfoex4 {
  int                ai_flags;
  int                ai_family;
  int                ai_socktype;
  int                ai_protocol;
  size_t             ai_addrlen;
  PWSTR              ai_canonname;
  struct sockaddr    *ai_addr;
  void               *ai_blob;
  size_t             ai_bloblen;
  GUID               *ai_provider;
  struct addrinfoex4 *ai_next;
  int                ai_version;
  PWSTR              ai_fqdn;
  int                ai_interfaceindex;
  HANDLE             ai_resolutionhandle;
} ADDRINFOEX4, *PADDRINFOEX4, *LPADDRINFOEX4;

멤버

ai_flags

GetAddrInfoEx 함수에 사용되는 옵션을 나타내는 플래그입니다.

ai_flags 멤버에 대해 지원되는 값은 Winsock2.h 포함 파일에 정의되며 다음 옵션의 조합일 수 있습니다.

의미
AI_PASSIVE
0x01
소켓 주소는 bind 함수 호출에 사용됩니다.
AI_CANONNAME
0x02
정식 이름은 첫 번째 ai_canonname 멤버에 반환됩니다.
AI_NUMERICHOST
0x04
GetAddrInfoEx 함수에 전달된 nodename 매개 변수는 숫자 문자열이어야 합니다.
AI_ALL
0x0100
이 비트가 설정되면 AI_V4MAPPED 있는 IPv6 주소 및 IPv4 주소에 대한 요청이 수행됩니다.

이 옵션은 Windows Vista 이상에서 지원됩니다.

AI_ADDRCONFIG
0x0400
GetAddrInfoEx는 전역 주소가 구성된 경우에만 resolve. IPv6 및 IPv4 루프백 주소는 유효한 전역 주소로 간주되지 않습니다.

이 옵션은 Windows Vista 이상에서 지원됩니다.

AI_V4MAPPED
0x0800
IPv6 주소에 대한 GetAddrInfoEx 요청이 실패하면 IPv4 주소에 대한 이름 서비스 요청이 이루어지고 이러한 주소는 IPv4 매핑된 IPv6 주소 형식으로 변환됩니다.

이 옵션은 Windows Vista 이상에서 지원됩니다.

AI_NON_AUTHORITATIVE
0x04000
주소 정보는 신뢰할 수 없는 결과에서 가져옵니다.

GetAddrInfoExpHints 매개 변수에서 이 옵션을 설정하면 NS_EMAIL 네임스페이스 공급자는 신뢰할 수 있는 결과와 신뢰할 수 없는 결과를 모두 반환합니다. 이 옵션을 설정하지 않으면 신뢰할 수 있는 결과만 반환됩니다.

이 옵션은 NS_EMAIL 네임 스페이스에 대해 Windows Vista 이상에서만 지원됩니다.

AI_SECURE
0x08000
주소 정보는 보안 채널에서 가져옵니다.

AI_SECURE 비트가 설정된 경우 NS_EMAIL 네임스페이스 공급자는 보안 강화를 통해 얻은 결과를 반환하여 스푸핑 가능성을 최소화합니다.

GetAddrInfoExpHints 매개 변수에서 이 옵션을 설정하면 NS_EMAIL 네임스페이스 공급자는 가능한 스푸핑을 최소화하기 위해 향상된 보안으로 얻은 결과만 반환합니다.

이 옵션은 NS_EMAIL 네임 스페이스에 대해 Windows Vista 이상에서만 지원됩니다.

AI_RETURN_PREFERRED_NAMES
0x010000
주소 정보는 특정 네임스페이스가 있는 게시의 기본 이름에 대한 것입니다.

GetAddrInfoExpHints 매개 변수에서 이 옵션을 설정하면 pName 매개 변수에 이름을 입력하지 않아야 하며 NS_EMAIL 네임스페이스 공급자는 게시에 대한 기본 이름을 반환합니다.

이 옵션은 NS_EMAIL 네임 스페이스에 대해 Windows Vista 이상에서만 지원됩니다.

AI_FQDN
0x00020000
정규화된 도메인 이름은 첫 번째 ai_fqdn 멤버에 반환됩니다.

이 옵션이 GetAddrInfoExpHints 매개 변수에서 설정되고 pName 매개 변수에 플랫 이름(단일 레이블)이 지정되면 이름이 최종적으로 확인된 정규화된 도메인 이름이 반환됩니다.

이 옵션은 Windows 7, Windows Server 2008 R2 이상에서 지원됩니다.

AI_FILESERVER
0x00040000
쿼리 중인 호스트 이름이 파일 공유 시나리오에서 사용되고 있다는 네임스페이스 공급자에 대한 힌트입니다. 네임스페이스 공급자는 이 힌트를 무시할 수 있습니다.

이 옵션은 Windows 7, Windows Server 2008 R2 이상에서 지원됩니다.

AI_DISABLE_IDN_ENCODING
0x00080000
GetAddrInfoEx 함수에서 호출하는 이름 확인 함수에서 Punycode를 사용하여 자동 International Domain Name 인코딩을 사용하지 않도록 설정합니다.

이 옵션은 Windows 8, Windows Server 2012 이상에서 지원됩니다.

AI_EXTENDED
0x80000000
현재 개체가 확장되었음을 나타냅니다. 즉, addrinfoex2 이상입니다.

이 옵션은 Windows 8.1, Windows Server 2012 R2 이상에서 지원됩니다.

AI_RESOLUTION_HANDLE
0x40000000
해결 핸들은 ai_resolutionhandle 멤버에 반환됩니다.

이 옵션은 Windows 10, Windows Server 2016 이상에서 지원됩니다.

ai_family

주소 패밀리입니다.

주소 패밀리에 대한 가능한 값은 Ws2def.h 헤더 파일에 정의되어 있습니다. Ws2def.h 헤더 파일은 Winsock2.h에 자동으로 포함되며 직접 사용하면 안 됩니다.

현재 지원되는 값은 IPv4 및 IPv6의 인터넷 주소 패밀리 형식인 AF_INET 또는 AF_INET6. 주소 패밀리에 대한 다른 옵션(예: NetBIOS에서 사용할 AF_NETBIOS )은 주소 패밀리에 대한 Windows Sockets 서비스 공급자가 설치된 경우 지원됩니다. AF_ 주소 패밀리 및 PF_ 프로토콜 패밀리 상수의 값은 동일하므로(예: AF_INETPF_INET) 상수를 사용할 수 있습니다.

아래 표에는 주소 패밀리에 대한 공통 값이 나열되어 있지만 다른 많은 값이 가능합니다.

의미
AF_UNSPEC
0
주소 패밀리는 지정되지 않습니다.
AF_INET
2
IPv4(인터넷 프로토콜 버전 4) 주소 패밀리입니다.
AF_NETBIOS
17
NetBIOS 주소 패밀리입니다. 이 주소 패밀리는 NetBIOS용 Windows 소켓 공급자가 설치된 경우에만 지원됩니다.
AF_INET6
23
IPv6(인터넷 프로토콜 버전 6) 주소 패밀리입니다.
AF_IRDA
26
IrDA(적외선 데이터 연결) 주소 패밀리. 이 주소 패밀리는 컴퓨터에 적외선 포트와 드라이버가 설치된 경우에만 지원됩니다.
AF_BTH
32
Bluetooth 주소 패밀리입니다. 이 주소 패밀리는 Bluetooth 어댑터가 설치된 경우에만 지원됩니다.

ai_socktype

소켓 유형입니다. 소켓 형식에 대한 가능한 값은 Winsock2.h 포함 파일에 정의되어 있습니다.

다음 표에서는 Windows 소켓 2에 지원되는 소켓 유형에 대한 가능한 값을 나열합니다.

의미
SOCK_STREAM
1
OOB 데이터 전송 메커니즘을 사용하여 시퀀스된 신뢰할 수 있는 양방향 연결 기반 바이트 스트림을 제공합니다. 인터넷 주소 패밀리(AF_INET 또는AF_INET6)에 TCP(Transmission Control Protocol)를 사용합니다. ai_family 멤버가 AF_IRDA 경우 SOCK_STREAM 유일하게 지원되는 소켓 유형입니다.
SOCK_DGRAM
2
고정(일반적으로 작은) 최대 길이의 연결이 없고 신뢰할 수 없는 버퍼인 데이터그램을 지원합니다. 인터넷 주소 패밀리(AF_INET 또는 AF_INET6)에 UDP(사용자 데이터그램 프로토콜)를 사용합니다.
SOCK_RAW
3
애플리케이션이 다음 상위 계층 프로토콜 헤더를 조작할 수 있는 원시 소켓을 제공합니다. IPv4 헤더를 조작하려면 소켓에서 IP_HDRINCL 소켓 옵션을 설정해야 합니다. IPv6 헤더를 조작하려면 소켓에서 IPV6_HDRINCL 소켓 옵션을 설정해야 합니다.
SOCK_RDM
4
신뢰할 수 있는 메시지 데이터그램을 제공합니다. 이 유형의 예로 Windows에서 PGM(실용 일반 멀티캐스트) 멀티캐스트 프로토콜 구현이 있으며, 이를 신뢰할 수 있는 멀티캐스트 프로그래밍이라고도 합니다.
SOCK_SEQPACKET
5
데이터그램을 기반으로 의사 스트림 패킷을 제공합니다.
 

Windows 소켓 2에서는 새 소켓 유형이 도입되었습니다. 애플리케이션은 WSAEnumProtocols 함수를 통해 사용 가능한 각 전송 프로토콜의 특성을 동적으로 검색할 수 있습니다. 따라서 애플리케이션은 주소 패밀리에 대해 가능한 소켓 유형 및 프로토콜 옵션을 결정하고 이 매개 변수를 지정할 때 이 정보를 사용할 수 있습니다. Winsock2.h 및Ws2def.h 헤더 파일의 소켓 형식 정의는 새 소켓 형식, 주소 패밀리 및 프로토콜이 정의되면 주기적으로 업데이트됩니다.

Windows 소켓 1.1에서는 가능한 소켓 유형만 SOCK_DATAGRAMSOCK_STREAM.

ai_protocol

프로토콜 유형입니다. 가능한 옵션은 지정된 주소 패밀리 및 소켓 유형에 따라 다릅니다. ai_protocol 가능한 값은 Winsock2.hWsrm.h 헤더 파일에 정의됩니다.

Windows Vista 이상용으로 릴리스된 Windows SDK 헤더 파일의 organization 변경되었으며 이 멤버는 Ws2def.h 헤더 파일에 정의된 IPPROTO 열거형 형식의 값 중 하나일 수 있습니다. Ws2def.h 헤더 파일은 Winsock2.h에 자동으로 포함되며 직접 사용하면 안 됩니다.

ai_protocol 값이 0으로 지정된 경우 호출자는 프로토콜을 지정하지 않고 서비스 공급자가 사용할 ai_protocol 선택합니다. IPv4 및 IPv6 이외의 프로토콜의 경우 ai_protocol 0으로 설정합니다.

다음 표에서는 다른 많은 값이 가능하지만 ai_protocol 멤버에 대한 공통 값을 나열합니다.

의미
IPPROTO_TCP
6
TCP(Transmission Control Protocol). ai_family 멤버가 AF_INET 또는 AF_INET6ai_socktype멤버가SOCK_STREAM 경우 가능한 값입니다.
IPPROTO_UDP
17
UDP(사용자 데이터그램 프로토콜)입니다. ai_family 멤버가 AF_INET 또는 AF_INET6형식 매개 변수가 SOCK_DGRAM 경우 가능한 값입니다.
IPPROTO_RM
113
신뢰할 수 있는 멀티캐스트용 PGM 프로토콜입니다. ai_family 멤버가 AF_INET ai_socktype 멤버가 SOCK_RDM 경우 가능한 값입니다. Windows Vista 이상용으로 릴리스된 Windows SDK 이 값을 IPPROTO_PGM이라고도 합니다.
 

ai_family 멤버가 AF_IRDA 경우 ai_protocol 0이어야 합니다.

ai_addrlen

ai_addr 멤버가 가리키는 버퍼의 길이(바이트)입니다.

ai_canonname

호스트의 정식 이름입니다.

ai_addr

sockaddr 구조체에 대한 포인터입니다. 반환된 각 addrinfoex4 구조체의 ai_addr 멤버는 채워진 소켓 주소 구조를 가리킵니다. 반환된 각 addrinfoex4 구조체의 길이(바이트)가 ai_addrlen 멤버에 지정됩니다.

ai_blob

주소 목록 이외의 이름과 연결된 공급자별 네임스페이스 정보를 반환하는 데 사용되는 데이터에 대한 포인터입니다. ai_blob 가리키는 버퍼의 길이(바이트)를 ai_bloblen 멤버에 지정해야 합니다.

ai_bloblen

ai_blob 멤버의 길이(바이트)입니다.

ai_provider

특정 네임스페이스 공급자의 GUID에 대한 포인터입니다.

ai_next

연결된 목록의 다음 구조체에 대한 포인터입니다. 이 매개 변수는 연결된 목록의 마지막 addrinfoex4 구조에서 NULL로 설정됩니다.

ai_version

이 구조체의 버전 번호입니다. 현재 이 구조체 버전에 사용되는 값은 4입니다.

ai_fqdn

호스트의 정규화된 도메인 이름입니다.

ai_interfaceindex

IP_ADAPTER_ADDRESSES 정의된 인터페이스 인덱스입니다. GetAdaptersAddresses에서 반환된 IfIndex 속성입니다.

ai_resolutionhandle

호스트의 정규화된 도메인 이름을 가리키는 핸들입니다.

설명

addrinfoex4 구조체는 Windows 10 및 Windows Server 2016 지원됩니다.

addrinfoex4 구조체는 GetAddrInfoEx를 통해 전달된 addrinfoex4.ai_flags 멤버에서 AI_EXTENDED | AI_FQDN | AI_CANONNAME | AI_RESOLUTION_HANDLE 비트가 설정된 경우 호스트 주소 정보를 보유하는 데 GetAddrInfoEx 함수에서 사용됩니다.hints 매개 변수입니다.

addrinfoex4 구조체는 정식 이름, 호스트의 정규화된 도메인 이름 및 정규화된 도메인 이름에 대한 핸들을 반환할 수 있는 addrinfoex 구조체의 향상된 버전입니다. 차례로 GetAddrInfoExgetaddrinfoGetAddrInfoW 함수와 함께 사용되는 addrinfoaddrinfoW 구조체의 향상된 버전입니다. GetAddrInfoEx 함수를 사용하면 네임스페이스 공급자를 지정하여 쿼리를 resolve 수 있습니다. IPv6 및 IPv4 프로토콜에 사용하기 위해 이름 확인은 DNS(도메인 이름 시스템), 로컬 호스트 파일, 전자 메일 공급자(NS_EMAIL 네임스페이) 또는 다른 명명 메커니즘을 통해 확인할 수 있습니다.

tha ai_blob 멤버의 Blob 데이터는 이름과 연결된 추가 공급자별 네임스페이스 정보를 반환하는 데 사용됩니다. ai_blob 멤버의 데이터 형식은 특정 네임스페이스 공급자와 관련이 있습니다. 현재 blob 데이터는 NS_EMAIL 네임스페이스 공급자가 추가 정보를 제공하는 데 사용됩니다.

UNICODE 또는 _UNICODE 정의되면 addrinfoex4 는 이 구조체의 유니코드 버전인 addrinfoex4W에 정의됩니다. 문자열 매개 변수는 PWSTR 데이터 형식에 정의되며 addrinfoex4W 구조체가 사용됩니다.

UNICODE 또는 _UNICODE 정의되지 않은 경우 addrinfoex4 는 이 구조체의 ANSI 버전인 addrinfoex4A에 정의됩니다. 문자열 매개 변수는 char * 데이터 형식이며 addrinfoex4A 구조체가 사용됩니다.

GetAddrInfoEx를 성공적으로 호출하면 GetAddrInfoEx 함수에 전달된 ppResult 매개 변수에 addrinfoex4 구조체의 연결된 목록이 반환됩니다. NULL 포인터가 발견될 때까지 반환된 각 addrinfoex4 구조체의 ai_next 멤버에 제공된 포인터를 따라 목록을 처리할 수 있습니다. 반환된 각 addrinfoex4 구조체에서 ai_family, ai_socktypeai_protocol 멤버는 소켓 또는 WSASocket 함수 호출의 각 인수에 해당합니다. 또한 반환된 각 addrinfoex4 구조체의 ai_addr 멤버는 채워진 소켓 주소 구조를 가리키며, 길이는 ai_addrlen 멤버에 지정됩니다.

예제

다음 코드에서는 addrinfoex4 구조체를 사용하여 GetAddrInfoEx를 호출하여 FQDN에 대한 핸들을 검색하는 방법을 설명합니다. 그런 다음 샘플은 ASSOCIATE_NAMERES_CONTEXT_INPUT 구조를 사용하여 WSAIoctl을 호출합니다.

// 
// Connect to a server using its IPv4 addresses 
// 

VOID 
ConnectServer( 
    PCWSTR server) 
{ 
    int iResult; 
    PADDRINFOEX4 pResult = NULL; 
    ADDRINFOEX3 hints = { 0 }; 
    PADDRINFOEX4 pCur = NULL; 
    WSADATA wsaData; 
    SOCKET connectSocket = INVALID_SOCKET; 
    ULONG bytesReturned = 0; 
    ASSOCIATE_NAMERES_CONTEXT_INPUT input = { 0 }; 
    SOCKADDR_IN clientService; 
    wchar_t ipstringbuffer[46]; 
    String string; 
    DWORD dwRetval; 
    //  
    //  Initialize Winsock 
    // 
    iResult = WSAStartup( 
        MAKEWORD(2, 2),  
        &wsaData); 
    if (iResult != 0) { 
        printf("WSAStartup failed: %d\n", iResult); 
        goto Exit; 
    } 

    //  
    // Create a SOCKET for connection 
    // 
    connectSocket = socket( 
        AF_UNSPEC,  
        SOCK_STREAM,  
        IPPROTO_TCP); 
    if (connectSocket == INVALID_SOCKET)  
    { 
        printf("socket failed: %d\n", WSAGetLastError()); 
        goto Exit; 
    } 

    // 
    // Do name resolution 
    // 

    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_flags = AI_EXTENDED | AI_FQDN | AI_CANONNAME | AI_RESOLUTION_HANDLE; 
    hints.ai_version = ADDRINFOEX_VERSION_4; 

    dwRetval = GetAddrInfoExW( 
        server, 
        NULL, 
        NS_DNS, 
        NULL, 
        (const ADDRINFOEXW*)&hints, 
        (PADDRINFOEXW*)&pResult, 
        NULL, 
        NULL, 
        NULL, NULL); 
    if (dwRetval != 0) { 
        printf("GetAddrInfoEx failed with error: %d\n", dwRetval); 
        goto Exit; 
    } 
    input.TransportSettingId.Guid = ASSOCIATE_NAMERES_CONTEXT; 
    input.Handle = pResult->ai_resolutionhandle; 

    // 
    // Associate socket with the handle 
    // 

    if (WSAIoctl( 
            connectSocket, 
            SIO_APPLY_TRANSPORT_SETTING, 
            (VOID *)&input, 
            sizeof(input), 
            NULL, 
            0, 
            &bytesReturned, 
            NULL, 
            NULL) == SOCKET_ERROR) 
    if (iResult != 0){ 
        printf("WSAIoctl failed: %d\n", WSAGetLastError()); 
        goto Exit; 
    }     

    // 
    // Connect to server 
    // 

    pCur = pResult; 
    while (pCur != NULL) 
    { 
        if (pCur->ai_addr->sa_family == AF_INET) 
        { 
            clientService = *(const sockaddr_in*)pCur->ai_addr; 
            clientService.sin_port = htons(80); 
            if (connect( 
                connectSocket, 
                (const SOCKADDR *)&clientService, 
                sizeof(clientService)) == SOCKET_ERROR) 
            { 
                printf("connect failed: %d\n", WSAGetLastError()); 
                goto Exit; 
            } 
        } 
        pCur = pCur->ai_next; 
    } 

Exit: 

    if (connectSocket != INVALID_SOCKET) 
    { 
        closesocket(connectSocket); 
    } 
    if (pResult) 
    { 
        FreeAddrInfoExW((ADDRINFOEXW*)pResult); 
    } 
    WSACleanup(); 
    return; 
} 

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2016 [데스크톱 앱만 해당]
머리글 ws2def.h

추가 정보

GetAddrInfoEx

addrinfo

addrinfoW

addrinfoex

addrinfoex3