다음을 통해 공유


ADDRINFOA 구조체(ws2def.h)

addrinfo 구조체는 getaddrinfo 함수에서 호스트 주소 정보를 보유하는 데 사용됩니다.

구문

typedef struct addrinfo {
  int             ai_flags;
  int             ai_family;
  int             ai_socktype;
  int             ai_protocol;
  size_t          ai_addrlen;
  char            *ai_canonname;
  struct sockaddr *ai_addr;
  struct addrinfo *ai_next;
} ADDRINFOA, *PADDRINFOA;

멤버

ai_flags

형식: int

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

ai_flags 멤버에 대해 지원되는 값은 Windows 7 이상용 Windows SDK Ws2def.h 헤더 파일에 정의되어 있습니다. 이러한 값은 Windows Server 2008 및 Windows Vista용 Windows SDK Ws2tcpip.h 헤더 파일에 정의되어 있습니다. 이러한 값은 Windows Server 2003용 플랫폼 SDK 및 Windows XP의 Ws2tcpip.h 헤더 파일에 정의되어 있습니다. ai_flags 멤버에 대해 지원되는 값은 다음 옵션의 조합일 수 있습니다.

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

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

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

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

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

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

AI_NON_AUTHORITATIVE
0x04000
주소 정보는 신뢰할 수 없는 네임스페이스 공급자에서 제공될 수 있습니다.

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

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

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

AI_RETURN_PREFERRED_NAMES
0x010000
주소 정보는 사용자의 기본 설정 이름에 대한 것입니다.

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

AI_FQDN
0x00020000
플랫 이름(단일 레이블)을 지정하면 getaddrinfo 는 이름이 최종적으로 확인된 정규화된 도메인 이름을 반환합니다. 정규화된 도메인 이름은 ai_canonname 멤버에 반환됩니다.

이는 DNS에 등록된 정식 이름을 반환하는 AI_CANONNAME 비트 플래그와 다르며, 이는 플랫 이름이 확인된 정규화된 도메인 이름과 다를 수 있습니다.

AI_FQDNAI_CANONNAME 비트 중 하나만 설정할 수 있습니다. 두 플래그가 모두 EAI_BADFLAGS 있으면 getaddrinfo 함수가 실패합니다.

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

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

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

ai_family

형식: int

주소 패밀리입니다. 주소 패밀리에 대한 가능한 값은 Winsock2.h 헤더 파일에 정의되어 있습니다.

Windows Vista 이상용으로 릴리스된 Windows SDK 헤더 파일의 organization 변경되었으며 주소 패밀리에 대한 가능한 값은 Ws2def.h 헤더 파일에 정의됩니다. Ws2def.h 헤더 파일은 Winsock2.h에 자동으로 포함되며 직접 사용하면 안 됩니다.

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

다음 표에서는 주소 패밀리에 대한 공통 값을 나열하지만 다른 많은 값이 가능합니다.

의미
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 어댑터가 Windows Server 2003 이상에 설치된 경우에만 지원됩니다.

ai_socktype

형식: int

소켓 유형입니다. 소켓 형식에 대한 가능한 값은 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

형식: int

프로토콜 유형입니다. 가능한 옵션은 지정된 주소 패밀리 및 소켓 유형에 따라 다릅니다. 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

형식: size_t

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

ai_canonname

형식: char*

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

ai_addr

형식: 구조체 sockaddr*

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

ai_next

형식: 구조체 addrinfo*

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

설명

addrinfo 구조체는 ANSI getaddrinfo 함수에서 호스트 주소 정보를 보유하는 데 사용됩니다.

addrinfoW 구조체는 유니코드 GetAddrInfoW 함수에서 사용하는 이 구조체의 버전입니다.

Ws2tcpip.h 헤더 파일의 매크로는 ADDRINFOT 구조체와 GetAddrInfo의 혼합 사례 함수 이름을 정의합니다. GetAddrInfo 함수는 TCHAR 형식 포인터의 nodenameservname 매개 변수와 ADDRINFOT 형식 포인터의 힌트res 매개 변수를 사용하여 호출되어야 합니다. UNICODE 또는 _UNICODE 정의되지 않은 경우 ADDRINFOTaddrinfo 구조에 정의되고 GetAddrInfo 는 이 함수의 ANSI 버전인 getaddrinfo에 정의됩니다. UNICODE 또는 _UNICODE 정의되면 ADDRINFOTaddrinfoW 구조에 정의되고 GetAddrInfo 는 이 함수의 유니코드 버전인 GetAddrInfoW로 정의됩니다.

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

이전 버전의 Windows에서 getaddrinfo 및 addrinfo 구조체 지원

addrinfo 구조를 사용하는 getaddrinfo 함수가 Windows XP 이상에서 Ws2_32.dll 추가되었습니다. addrinfo 구조는 Windows XP 이상용으로 릴리스된 플랫폼 SDK 및 Windows Vista 이상용으로 릴리스된 Windows SDK 포함된 Ws2tcpip.h 헤더 파일에 정의됩니다.

이전 버전의 Windows(Windows 2000)에서 getaddrinfo 함수 및 addrinfo 구조를 사용하는 애플리케이션을 실행하려면 Ws2tcpip.hWspiapi.h 파일을 포함해야 합니다. Wspiapi.h include 파일이 추가되면 getaddrinfo 함수는 Wspiapi.h 파일의 WspiapiGetAddrInfo 인라인 함수에 정의됩니다. 런타임에 WspiapiGetAddrInfo 함수는 Ws2_32.dll 또는 Wship6.dll (Windows 2000용 IPv6 기술 미리 보기의 getaddrinfo를 포함하는 파일)에 getaddrinfo가 포함되지 않은 경우 getaddrinfo 버전이 Wspiapi.h 헤더 파일의 코드를 기반으로 인라인으로 구현되는 방식으로 구현됩니다. 이 인라인 코드는 getaddrinfo 함수를 기본적으로 지원하지 않는 이전 Windows 플랫폼에서 사용됩니다.

IPv6 프로토콜은 Windows 2000용 IPv6 기술 미리 보기가 설치된 경우 Windows 2000에서 지원됩니다. 그렇지 않으면 Windows XP 이전 버전의 Windows에서 getaddrinfo 지원이 IPv4 이름 확인을 처리하는 것으로 제한됩니다.

addrinfoW 구조를 사용하는 GetAddrInfoW 함수는 getaddrinfo 함수 및 연결된 addrinfo 구조체의 유니코드 버전입니다. GetAddrInfoW 함수가 Windows XP SP2(서비스 팩 2)의 Ws2_32.dll 추가되었습니다. GetAddrInfoW 함수 및 addrinfoW 구조체는 WINDOWS XP SP2 이전 버전의 Windows에서 사용할 수 없습니다.

예제

다음 코드 예제에서는 addrinfo 구조체의 사용을 보여 줌.


#undef UNICODE

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int __cdecl main(int argc, char **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;
    INT iRetval;

    DWORD dwRetval;

    int i = 1;
    
    struct addrinfo *result = NULL;
    struct addrinfo *ptr = NULL;
    struct addrinfo hints;

    struct sockaddr_in  *sockaddr_ipv4;
//    struct sockaddr_in6 *sockaddr_ipv6;
    LPSOCKADDR sockaddr_ip;

    char ipstringbuffer[46];
    DWORD ipbufferlength = 46;

    // Validate the parameters
    if (argc != 3) {
        printf("usage: %s <hostname> <servicename>\n", argv[0]);
        printf("       provides protocol-independent translation\n");
        printf("       from an ANSI host name to an IP address\n");
        printf("%s example usage\n", argv[0]);
        printf("   %s www.contoso.com 0\n", argv[0]);
        return 1;
    }

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    //--------------------------------
    // Setup the hints address info structure
    // which is passed to the getaddrinfo() function
    ZeroMemory( &hints, sizeof(hints) );
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    printf("Calling getaddrinfo with following parameters:\n");
    printf("\tnodename = %s\n", argv[1]);
    printf("\tservname (or port) = %s\n\n", argv[2]);
    
//--------------------------------
// Call getaddrinfo(). If the call succeeds,
// the result variable will hold a linked list
// of addrinfo structures containing response
// information
    dwRetval = getaddrinfo(argv[1], argv[2], &hints, &result);
    if ( dwRetval != 0 ) {
        printf("getaddrinfo failed with error: %d\n", dwRetval);
        WSACleanup();
        return 1;
    }

    printf("getaddrinfo returned success\n");
    
    // Retrieve each address and print out the hex bytes
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

        printf("getaddrinfo response %d\n", i++);
        printf("\tFlags: 0x%x\n", ptr->ai_flags);
        printf("\tFamily: ");
        switch (ptr->ai_family) {
            case AF_UNSPEC:
                printf("Unspecified\n");
                break;
            case AF_INET:
                printf("AF_INET (IPv4)\n");
                sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr;
                printf("\tIPv4 address %s\n",
                    inet_ntoa(sockaddr_ipv4->sin_addr) );
                break;
            case AF_INET6:
                printf("AF_INET6 (IPv6)\n");
                // the InetNtop function is available on Windows Vista and later
                // sockaddr_ipv6 = (struct sockaddr_in6 *) ptr->ai_addr;
                // printf("\tIPv6 address %s\n",
                //    InetNtop(AF_INET6, &sockaddr_ipv6->sin6_addr, ipstringbuffer, 46) );
                
                // We use WSAAddressToString since it is supported on Windows XP and later
                sockaddr_ip = (LPSOCKADDR) ptr->ai_addr;
                // The buffer length is changed by each call to WSAAddresstoString
                // So we need to set it for each iteration through the loop for safety
                ipbufferlength = 46;
                iRetval = WSAAddressToString(sockaddr_ip, (DWORD) ptr->ai_addrlen, NULL, 
                    ipstringbuffer, &ipbufferlength );
                if (iRetval)
                    printf("WSAAddressToString failed with %u\n", WSAGetLastError() );
                else    
                    printf("\tIPv6 address %s\n", ipstringbuffer);
                break;
            case AF_NETBIOS:
                printf("AF_NETBIOS (NetBIOS)\n");
                break;
            default:
                printf("Other %ld\n", ptr->ai_family);
                break;
        }
        printf("\tSocket type: ");
        switch (ptr->ai_socktype) {
            case 0:
                printf("Unspecified\n");
                break;
            case SOCK_STREAM:
                printf("SOCK_STREAM (stream)\n");
                break;
            case SOCK_DGRAM:
                printf("SOCK_DGRAM (datagram) \n");
                break;
            case SOCK_RAW:
                printf("SOCK_RAW (raw) \n");
                break;
            case SOCK_RDM:
                printf("SOCK_RDM (reliable message datagram)\n");
                break;
            case SOCK_SEQPACKET:
                printf("SOCK_SEQPACKET (pseudo-stream packet)\n");
                break;
            default:
                printf("Other %ld\n", ptr->ai_socktype);
                break;
        }
        printf("\tProtocol: ");
        switch (ptr->ai_protocol) {
            case 0:
                printf("Unspecified\n");
                break;
            case IPPROTO_TCP:
                printf("IPPROTO_TCP (TCP)\n");
                break;
            case IPPROTO_UDP:
                printf("IPPROTO_UDP (UDP) \n");
                break;
            default:
                printf("Other %ld\n", ptr->ai_protocol);
                break;
        }
        printf("\tLength of this sockaddr: %d\n", ptr->ai_addrlen);
        printf("\tCanonical name: %s\n", ptr->ai_canonname);
    }

    freeaddrinfo(result);
    WSACleanup();

    return 0;
}

요구 사항

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

추가 정보

GetAddrInfoW

WSAEnumProtocols

addrinfoW

bind

getaddrinfo

sockaddr