Bagikan melalui


Fungsi GetAddrInfoExA (ws2tcpip.h)

Fungsi GetAddrInfoEx menyediakan resolusi nama independen protokol dengan parameter tambahan untuk memenuhi syarat penyedia namespace layanan mana yang harus menangani permintaan.

Sintaks

INT WSAAPI GetAddrInfoExA(
  [in, optional]  PCSTR                              pName,
  [in, optional]  PCSTR                              pServiceName,
  [in]            DWORD                              dwNameSpace,
  [in, optional]  LPGUID                             lpNspId,
  [in, optional]  const ADDRINFOEXA                  *hints,
  [out]           PADDRINFOEXA                       *ppResult,
  [in, optional]  timeval                            *timeout,
  [in, optional]  LPOVERLAPPED                       lpOverlapped,
  [in, optional]  LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine,
  [out, optional] LPHANDLE                           lpNameHandle
);

Parameter

[in, optional] pName

Penunjuk ke string yang dihentikan NULL yang berisi nama host (node) atau string alamat host numerik. Untuk protokol Internet, string alamat host numerik adalah alamat IPv4 dotted-decimal atau alamat hex IPv6.

[in, optional] pServiceName

Penunjuk ke string opsional yang dihentikan NULL yang berisi nama layanan atau nomor port yang direpresentasikan sebagai string.

Nama layanan adalah alias string untuk nomor port. Misalnya, "http" adalah alias untuk port 80 yang ditentukan oleh Internet Engineering Task Force (IETF) sebagai port default yang digunakan oleh server web untuk protokol HTTP. Nilai yang mungkin untuk parameter pServiceName saat nomor port tidak ditentukan tercantum dalam file berikut:

%WINDIR%\system32\drivers\etc\services

[in] dwNameSpace

Pengidentifikasi namespace opsional yang menentukan penyedia namespace layanan mana yang dikueri. Meneruskan pengidentifikasi namespace tertentu hanya akan menghasilkan penyedia namespace yang mendukung namespace yang ditentukan yang sedang dikueri. Menentukan NS_ALL akan mengakibatkan semua penyedia namespace layanan yang terinstal dan aktif sedang dikueri.

Opsi untuk parameter dwNameSpace tercantum dalam file Sertakan Winsock2.h . Beberapa penyedia namespace ditambahkan di Windows Vista dan yang lebih baru. Penyedia namespace layanan lain dapat diinstal, sehingga nilai yang mungkin berikut ini hanyalah yang umumnya tersedia. Banyak nilai lain yang dimungkinkan.

Nilai Makna
NS_ALL
0
Semua namespace layanan yang terinstal dan aktif.
NS_DNS
12
Namespace layanan sistem nama domain (DNS).
NS_NETBT
13
Namespace Layanan NetBIOS melalui TCP/IP (NETBT).
NS_WINS
14
Namespace Layanan Penamaan Internet Windows (NS_WINS).
NS_NLA
15
Namespace layanan kesadaran lokasi jaringan (NLA).

Pengidentifikasi namespace ini didukung pada Windows XP dan yang lebih baru.

NS_BTH
16
Namespace Bluetooth.

Pengidentifikasi namespace ini didukung pada Windows Vista dan yang lebih baru.

NS_NTDS
32
Namespace Layanan Direktori Windows NT (NS_NTDS).
NS_EMAIL
37
Namespace email.

Pengidentifikasi namespace ini didukung pada Windows Vista dan yang lebih baru.

NS_PNRPNAME
38
Namespace peer-to-peer untuk nama serekan tertentu.

Pengidentifikasi namespace ini didukung pada Windows Vista dan yang lebih baru.

NS_PNRPCLOUD
39
Namespace peer-to-peer untuk kumpulan nama serekan.

Pengidentifikasi namespace ini didukung pada Windows Vista dan yang lebih baru.

[in, optional] lpNspId

Penunjuk ke GUID opsional dari penyedia namespace layanan tertentu untuk dikueri dalam kasus di mana beberapa penyedia namespace terdaftar di bawah namespace layanan tunggal seperti NS_DNS. Meneruskan GUID untuk penyedia namespace layanan tertentu hanya akan mengakibatkan penyedia namespace yang ditentukan yang dikueri. Fungsi WSAEnumNameSpaceProviders dapat dipanggil untuk mengambil GUID untuk penyedia namespace.

[in, optional] hints

Penunjuk ke struktur addrinfoex yang memberikan petunjuk tentang jenis soket yang didukung pemanggil.

Anggota ai_addrlen, ai_canonname, ai_addr, dan ai_next dari struktur addrinfoex yang ditujukkan oleh parameter pHints harus nol atau NULL. Jika tidak, fungsi GetAddrInfoEx akan gagal dengan WSANO_RECOVERY.

Lihat Keterangan untuk detail selengkapnya.

[out] ppResult

Penunjuk ke daftar tertaut dari satu atau beberapa struktur addrinfoex yang berisi informasi respons tentang host.

[in, optional] timeout

Parameter opsional yang menunjukkan waktu, dalam milidetik, untuk menunggu respons dari penyedia namespace sebelum membatalkan panggilan.

Parameter ini hanya didukung ketika makro UNICODE atau _UNICODE telah ditentukan di sumber sebelum memanggil fungsi GetAddrInfoEx . Jika tidak, parameter ini saat ini dicadangkan dan harus diatur ke NULL karena opsi batas waktu tidak didukung.

[in, optional] lpOverlapped

Penunjuk opsional ke struktur tumpang tindih yang digunakan untuk operasi asinkron.

Parameter ini hanya didukung ketika makro UNICODE atau _UNICODE telah ditentukan di sumber sebelum memanggil fungsi GetAddrInfoEx .

Pada Windows 8 dan Windows Server 2012, jika tidak ada parameter lpCompletionRoutine yang ditentukan, anggota hEvent dari struktur TUMPANG TINDIH harus diatur ke peristiwa reset manual untuk dipanggil setelah menyelesaikan panggilan asinkron. Jika rutinitas penyelesaian telah ditentukan, anggota hEvent harus NULL. Ketika peristiwa yang ditentukan oleh hEvent telah diatur, hasil operasi dapat diambil dengan memanggil fungsi GetAddrInfoExOverlappedResult .

Pada Windows 8 dan Windows Server 2012 setiap kali makro UNICODE atau _UNICODE tidak ditentukan, parameter ini saat ini dicadangkan dan harus diatur ke NULL.

Pada Windows 7 dan Windows Server 2008 R2 atau yang lebih lama, parameter ini saat ini dicadangkan dan harus diatur ke NULL karena operasi asinkron tidak didukung.

[in, optional] lpCompletionRoutine

Penunjuk opsional ke fungsi yang akan dipanggil setelah berhasil diselesaikan untuk operasi asinkron.

Parameter ini hanya didukung ketika makro UNICODE atau _UNICODE telah ditentukan di sumber sebelum memanggil fungsi GetAddrInfoEx .

Jika parameter ini ditentukan, parameter harus menjadi penunjuk ke fungsi dengan tanda tangan berikut:

typedef   
void   
(CALLBACK * LPLOOKUPSERVICE_COMPLETION_ROUTINE)(   
    __in      DWORD    dwError,   
    __in      DWORD    dwBytes,   
    __in      LPWSAOVERLAPPED lpOverlapped   
    );   

Ketika operasi asinkron telah selesai, rutinitas penyelesaian akan dipanggil dengan parameter lpOverlapped yang diatur ke nilai parameter lpOverlapped yang diteruskan ke GetAddrInfoEx. Anggota Pointer dari struktur TUMPANG TINDIH akan diatur ke nilai parameter ppResult dari panggilan asli. Jika anggota Pointer menunjuk ke penunjuk non-NULL ke struktur addrinfoex , pemanggil bertanggung jawab untuk memanggil FreeAddrInfoEx untuk membebaskan struktur addrinfoex . Parameter dwError yang diteruskan ke rutinitas penyelesaian akan diatur ke kode kesalahan Winsock. Parameter dwBytes dicadangkan untuk digunakan di masa mendatang dan harus diabaikan.

Pada Windows 8 dan Windows Server 2012 setiap kali makro UNICODE atau _UNICODE tidak ditentukan, parameter ini saat ini dicadangkan dan harus diatur ke NULL.

Pada Windows 7 dan Windows Server 2008 R2 atau yang lebih lama, parameter ini saat ini dicadangkan dan harus diatur ke NULL karena operasi asinkron tidak didukung.

[out, optional] lpNameHandle

Penunjuk opsional hanya digunakan untuk operasi asinkron.

Parameter ini hanya didukung ketika makro UNICODE atau _UNICODE telah ditentukan di sumber sebelum memanggil fungsi GetAddrInfoEx .

Pada Windows 8 dan Windows Server 2012, jika fungsi GetAddrInfoEx akan selesai secara asinkron, pointer yang dikembalikan di bidang ini dapat digunakan dengan fungsi GetAddrInfoExCancel . Handel yang dikembalikan valid ketika GetAddrInfoEx kembali sampai rutinitas penyelesaian dipanggil, peristiwa dipicu, atau fungsi GetAddrInfoExCancel dipanggil dengan handel ini.

Pada Windows 8 dan Windows Server 2012 setiap kali makro UNICODE atau _UNICODE tidak ditentukan, parameter ini saat ini dicadangkan dan harus diatur ke NULL.

Pada Windows 7 dan Windows Server 2008 R2 atau yang lebih lama, parameter ini saat ini dicadangkan dan harus diatur ke NULL karena operasi asinkron tidak didukung.

Menampilkan nilai

Setelah berhasil, GetAddrInfoEx mengembalikan NO_ERROR (0). Kegagalan mengembalikan kode kesalahan Windows Sockets bukan nol, seperti yang ditemukan di Kode Kesalahan Soket Windows.

Sebagian besar kode kesalahan bukan nol yang dikembalikan oleh peta fungsi GetAddrInfoEx ke serangkaian kesalahan yang diuraikan oleh rekomendasi Internet Engineering Task Force (IETF). Tabel berikut menunjukkan kode kesalahan ini dan setara WSA-nya. Disarankan agar kode kesalahan WSA digunakan, karena menawarkan informasi kesalahan yang akrab dan komprehensif untuk programmer Winsock.

Nilai kesalahan Setara WSA Deskripsi
EAI_AGAIN WSATRY_AGAIN Terjadi kegagalan sementara dalam resolusi nama.
EAI_BADFLAGS WSAEINVAL Parameter yang tidak valid disediakan. Kesalahan ini dikembalikan jika salah satu parameter yang dipesan bukan NULL. Kesalahan ini juga dikembalikan jika nilai yang tidak valid disediakan untuk anggota ai_flags parameter pHints .
EAI_FAIL WSANO_RECOVERY Terjadi kegagalan yang tidak dapat dipulihkan dalam resolusi nama.
EAI_FAMILY WSAEAFNOSUPPORT Anggota ai_family parameter pHints tidak didukung.
EAI_MEMORY WSA_NOT_ENOUGH_MEMORY Terjadi kegagalan alokasi memori.
EAI_NONAME WSAHOST_NOT_FOUND Nama tidak diselesaikan untuk parameter yang disediakan atau parameter pName dan pServiceName tidak disediakan.
EAI_SERVICE WSATYPE_NOT_FOUND Parameter pServiceName tidak didukung untuk anggota ai_socktype yang ditentukan dari parameter pHints .
EAI_SOCKTYPE WSAESOCKTNOSUPPORT Anggota ai_socktype parameter pHints tidak didukung.
 

Gunakan fungsi gai_strerror untuk mencetak pesan kesalahan berdasarkan kode EAI yang dikembalikan oleh fungsi GetAddrInfoEx . Fungsi gai_strerror disediakan untuk kepatuhan terhadap rekomendasi IETF, tetapi tidak aman untuk utas. Oleh karena itu, penggunaan fungsi Windows Sockets tradisional seperti WSAGetLastError direkomendasikan.

Kode kesalahan Makna
WSA_NOT_ENOUGH_MEMORY
Memori tidak cukup untuk melakukan operasi.
WSAEAFNOSUPPORT
Alamat yang tidak kompatibel dengan protokol yang diminta digunakan. Kesalahan ini dikembalikan jika ai_family anggota struktur addrinfoex yang diacu oleh parameter pHints tidak didukung.
WSAEINVAL
Argumen yang tidak valid disediakan. Kesalahan ini dikembalikan jika nilai yang tidak valid disediakan untuk anggota ai_flags struktur addrinfoex yang diacu oleh parameter pHints . Kesalahan ini juga dikembalikan ketika parameter dwNameSpace NS_PNRPNAME atau NS_PNRPCLOUD dan layanan nama peer-to-peer tidak beroperasi.
WSAESOCKTNOSUPPORT
Dukungan untuk jenis soket yang ditentukan tidak ada dalam keluarga alamat ini. Kesalahan ini dikembalikan jika ai_socktype anggota struktur addrinfoex yang diacu oleh parameter pHints tidak didukung.
WSAHOST_NOT_FOUND
Tidak ada host seperti itu yang diketahui. Kesalahan ini dikembalikan jika nama tidak diselesaikan untuk parameter yang disediakan atau parameter pName dan pServiceName tidak disediakan.
WSANO_DATA
Nama yang diminta valid, tetapi tidak ada data dari jenis yang diminta yang ditemukan.
WSANO_RECOVERY
Terjadi kesalahan yang tidak dapat dipulihkan saat pencarian database. Kesalahan ini dikembalikan jika terjadi kesalahan yang tidak dapat dipulihkan dalam resolusi nama.
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSASERVICE_NOT_FOUND
Tidak ada layanan seperti itu yang diketahui. Layanan tidak dapat ditemukan di ruang nama yang ditentukan. Kesalahan ini dikembalikan jika parameter pName atau pServiceName tidak ditemukan untuk namespace yang ditentukan dalam parameter dwNameSpace atau namespace yang ditentukan dalam parameter dwNameSpace tidak diinstal.
WSATRY_AGAIN
Ini biasanya kesalahan sementara selama resolusi nama host dan berarti bahwa server lokal tidak menerima respons dari server otoritatif. Kesalahan ini dikembalikan ketika kegagalan sementara dalam resolusi nama terjadi.
WSATYPE_NOT_FOUND
Kelas yang ditentukan tidak ditemukan. Parameter pServiceName tidak didukung untuk anggota ai_socktype yang ditentukan dari struktur addrinfoex yang diacu oleh parameter pHints .

Keterangan

Fungsi GetAddrInfoEx menyediakan terjemahan independen protokol dari nama host ke alamat dan dari nama layanan ke nomor port. Fungsi GetAddrInfoEx adalah versi yang disempurnakan dari fungsi getaddrinfo dan GetAddrInfoW . Fungsi GetAddrInfoEx memungkinkan menentukan penyedia namespace untuk menyelesaikan kueri.

Fungsi GetAddrInfoEx mengagregasi dan mengembalikan hasil dari beberapa penyedia namespace, kecuali penyedia namespace tertentu ditentukan. Untuk digunakan dengan protokol IPv6 dan IPv4, resolusi nama dapat dilakukan oleh Sistem Nama Domain (DNS), file host lokal, penyedia email ( namespace NS_EMAIL ), atau dengan mekanisme penamaan lainnya.

Ketika UNICODE atau _UNICODE ditentukan, GetAddrInfoEx didefinisikan ke GetAddrInfoExW, versi Unicode dari fungsi ini. Parameter string didefinisikan ke jenis data PWSTR dan struktur ADDRINFOEXW digunakan. Pada Parameter Windows 8 dan Windows Server 2012, batas waktu, lpOverlapped, lpCompletionRoutine, dan lpNameHandle dapat digunakan untuk memanggil fungsi GetAddrInfoEx sehingga dapat diselesaikan secara asinkron.

Ketika UNICODE atau _UNICODE tidak ditentukan, GetAddrInfoEx didefinisikan ke GetAddrInfoExA, versi ANSI dari fungsi ini. Parameter string adalah jenis data PCSTR dan struktur ADDRINFOEXA digunakan. Parameter timeout, lpOverlapped, lpCompletionRoutine, dan lpNameHandle harus diatur ke NULL.

Salah satu atau kedua parameter pName atau pServiceName harus menunjuk ke string yang dihentikan NULL. Umumnya keduanya disediakan.

Setelah berhasil, daftar tertaut struktur addrinfoex dikembalikan dalam parameter ppResult . Daftar dapat diproses dengan mengikuti penunjuk yang disediakan di anggota ai_next dari setiap struktur addrinfoex yang dikembalikan sampai penunjuk NULL ditemukan. Dalam setiap struktur addrinfoex yang dikembalikan, anggota ai_family, ai_socktype, dan ai_protocol sesuai dengan argumen masing-masing dalam panggilan fungsi soket atau WSASocket . Selain itu, anggota ai_addr di setiap struktur addrinfoex yang dikembalikan menunjuk ke struktur alamat soket yang diisi, yang panjangnya ditentukan dalam anggota ai_addrlen .

Jika parameter pName menunjuk ke nama komputer, semua alamat permanen untuk komputer yang dapat digunakan sebagai alamat sumber dikembalikan. Pada Windows Vista dan yang lebih baru, alamat ini akan mencakup semua alamat IP unicast yang dikembalikan oleh fungsi GetUnicastIpAddressTable atau GetUnicastIpAddressEntry tempat anggota SkipAsSource diatur ke false dalam struktur MIB_UNICASTIPADDRESS_ROW .

Jika parameter pName menunjuk ke string yang sama dengan "localhost", semua alamat loopback di komputer lokal dikembalikan.

Jika parameter pName berisi string kosong, semua alamat terdaftar di komputer lokal dikembalikan.

Pada Windows Server 2003 dan yang lebih baru jika parameter pName menunjuk ke string yang sama dengan ".. localmachine", semua alamat terdaftar di komputer lokal dikembalikan.

Jika parameter pName mengacu pada nama server virtual kluster, hanya alamat server virtual yang dikembalikan. Pada Windows Vista dan yang lebih baru, alamat ini akan mencakup semua alamat IP unicast yang dikembalikan oleh fungsi GetUnicastIpAddressTable atau GetUnicastIpAddressEntry tempat anggota SkipAsSource diatur ke true dalam struktur MIB_UNICASTIPADDRESS_ROW . Lihat Pengklusteran Windows untuk informasi selengkapnya tentang pengklusteran.

Windows 7 dengan Paket Layanan 1 (SP1) dan Windows Server 2008 R2 dengan Paket Layanan 1 (SP1) menambahkan dukungan ke Netsh.exe untuk mengatur atribut SkipAsSource pada alamat IP. Ini juga mengubah perilaku sehingga jika anggota SkipAsSource dalam struktur MIB_UNICASTIPADDRESS_ROW diatur ke false, alamat IP akan didaftarkan di DNS. Jika anggota SkipAsSource diatur ke true, alamat IP tidak terdaftar di DNS.

Perbaikan tersedia untuk Windows 7 dan Windows Server 2008 R2 yang menambahkan dukungan ke Netsh.exe untuk mengatur atribut SkipAsSource pada alamat IP. Perbaikan ini juga mengubah perilaku sehingga jika anggota SkipAsSource dalam struktur MIB_UNICASTIPADDRESS_ROW diatur ke false, alamat IP akan didaftarkan di DNS. Jika anggota SkipAsSource diatur ke true, alamat IP tidak terdaftar di DNS. Untuk informasi selengkapnya, lihat 2386184 Pangkalan Pengetahuan (KB).

Perbaikan serupa juga tersedia untuk Windows Vista dengan Paket Layanan 2 (SP2) dan Windows Server 2008 dengan Paket Layanan 2 (SP2) yang menambahkan dukungan ke Netsh.exe untuk mengatur atribut SkipAsSource pada alamat IP. Perbaikan ini juga mengubah perilaku sehingga jika anggota SkipAsSource dalam struktur MIB_UNICASTIPADDRESS_ROW diatur ke false, alamat IP akan didaftarkan di DNS. Jika anggota SkipAsSource diatur ke true, alamat IP tidak terdaftar di DNS.

Penelepon fungsi GetAddrInfoEx dapat memberikan petunjuk tentang jenis soket yang didukung melalui struktur addrinfoex yang ditujukkan oleh parameter pHints . Ketika parameter pHints digunakan, aturan berikut berlaku untuk struktur addrinfoex terkait:

  • Nilai AF_UNSPEC untuk ai_family menunjukkan pemanggil hanya akan menerima keluarga alamat AF_INET dan AF_INET6 . Perhatikan bahwa AF_UNSPEC dan PF_UNSPEC sama.
  • Nilai nol untuk ai_socktype menunjukkan pemanggil akan menerima jenis soket apa pun.
  • Nilai nol untuk ai_protocol menunjukkan pemanggil akan menerima protokol apa pun.
  • Anggota ai_addrlen harus diatur ke nol.
  • Anggota ai_canonname harus diatur ke NULL.
  • Anggota ai_addr harus diatur ke NULL.
  • Anggota ai_next harus diatur ke NULL.

Nilai lain dalam struktur addrinfoex yang disediakan dalam parameter pHints menunjukkan persyaratan khusus. Misalnya, jika pemanggil hanya menangani IPv4 dan tidak menangani IPv6, anggota ai_family harus diatur ke AF_INET. Misalnya, jika pemanggil hanya menangani TCP dan tidak menangani UDP, anggota ai_socktype harus diatur ke SOCK_STREAM.

Jika parameter pHints adalah penunjuk NULL , fungsi GetAddrInfoEx memperlakukannya seolah-olah struktur addrinfoex dalam pHint diinisialisasi dengan anggota ai_family diatur ke AF_UNSPEC dan semua anggota lainnya diatur ke NULL atau nol.

Ketika GetAddrInfoEx dipanggil dari layanan, jika operasi adalah hasil dari proses pengguna yang memanggil layanan, layanan harus meniru pengguna. Hal ini untuk memungkinkan keamanan diberlakukan dengan benar.

Fungsi GetAddrInfoEx dapat digunakan untuk mengonversi representasi string teks alamat IP ke struktur addrinfoex yang berisi struktur sockaddr untuk alamat IP dan informasi lainnya. Untuk digunakan dengan cara ini, string yang ditunjukkan oleh parameter pName harus berisi representasi teks alamat IP dan struktur addrinfoex yang ditunjukkan oleh parameter pHints harus memiliki bendera AI_NUMERICHOST yang diatur dalam anggota ai_flags . String yang ditunjukkan oleh parameter pName mungkin berisi representasi teks dari alamat IPv4 atau IPv6. Alamat IP teks dikonversi ke struktur addrinfoex yang diacu oleh parameter ppResult . Struktur addrinfoex yang dikembalikan berisi struktur sockaddr untuk alamat IP bersama dengan informasi tambahan tentang alamat IP.

Beberapa penyedia namespace layanan dapat diinstal pada komputer lokal untuk namespace yang sama. Misalnya, perangkat lunak jaringan Windows TCP/IP dasar mendaftar untuk namespace layanan NS_DNS. Microsoft Forefront Threat Management Gateway (TMG) dan Server Microsoft Internet Security and Acceleration (ISA) yang lebih lama menyertakan perangkat lunak Klien Firewall yang juga mendaftar untuk namespace layanan NS_DNS. Ketika parameter dwNameSpace diatur ke nilai (NS_DNS, misalnya) dan parameter lpNspId adalah NULL, hasil yang dikembalikan oleh fungsi GetAddrInfoEx adalah hasil gabungan dari semua penyedia namespace yang mendaftar untuk namespace yang ditentukan dengan hasil duplikat dihilangkan. Parameter lpNspId harus diatur ke GUID penyedia namespace layanan tertentu jika hanya penyedia namespace layanan tunggal yang akan dikueri.

Jika parameter pNameSpace diatur ke NS_ALL, maka hasil dari kueri semua penyedia namespace digabungkan dan dikembalikan. Dalam hal ini, respons duplikat dapat dikembalikan dalam hasil yang diarahkan oleh parameter ppResult jika beberapa penyedia namespace mengembalikan informasi yang sama.

Pada Windows 8 dan Windows Server 2012, jika fungsi GetAddrInfoEx akan selesai secara asinkron, penunjuk yang dikembalikan dalam parameter lpNameHandle dapat digunakan dengan fungsi GetAddrInfoExCancel . Handel yang dikembalikan valid ketika GetAddrInfoEx kembali sampai rutinitas penyelesaian dipanggil, peristiwa dipicu, atau fungsi GetAddrInfoExCancel dipanggil dengan handel ini.

Membebaskan Informasi Alamat dari Alokasi Dinamis

Semua informasi yang dikembalikan oleh fungsi GetAddrInfoEx yang ditujukkan oleh parameter ppResult dialokasikan secara dinamis, termasuk semua struktur addrinfoex , struktur alamat soket, dan string nama host kanonis yang diacu oleh struktur addrinfoex . Memori yang dialokasikan oleh panggilan yang berhasil ke fungsi ini harus dirilis dengan panggilan berikutnya ke FreeAddrInfoEx.

Contoh Kode

Contoh berikut menunjukkan penggunaan fungsi GetAddrInfoEx .
#ifndef UNICODE
#define UNICODE
#endif

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

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

// Need to link with Ole32.lib to print GUID
#pragma comment(lib, "ole32.lib")

int __cdecl wmain(int argc, wchar_t ** argv)
{

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

    DWORD dwRetval;

    int i = 1;

    DWORD dwNamespace = NS_ALL;
    LPGUID lpNspid = NULL;

    ADDRINFOEX *result = NULL;
    ADDRINFOEX *ptr = NULL;
    ADDRINFOEX hints;

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

    // DWORD ipbufferlength = 46;
    wchar_t ipstringbuffer[46];

    // variables needed to print namespace provider GUID
    int iRet = 0;
    WCHAR GuidString[40] = { 0 };

    // Validate the parameters
    if (argc != 4) {
        wprintf(L"usage: %ws <hostname> <servicename> <namespace>\n", argv[0]);
        wprintf(L"getaddrinfoex provides protocol-independent translation\n");
        wprintf(L"   from a host name to an IP address\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws www.contoso.com 0 12\n", argv[0]);
        wprintf(L"   looks up the www.contoso.com in the NS_DNS namespace\n",
                argv[0]);
        return 1;
    }
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"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;

    dwNamespace = (DWORD) _wtoi(argv[3]);

    wprintf(L"Calling GetAddrInfoEx with following parameters:\n");
    wprintf(L"\tName = %ws\n", argv[1]);
    wprintf(L"\tServiceName (or port) = %ws\n", argv[2]);
    wprintf(L"\tNamespace = %s (", argv[3]);
    switch (dwNamespace) {
    case NS_ALL:
        wprintf(L"(NS_ALL)\n");
        break;
    case NS_DNS:
        wprintf(L"(NS_DNS)\n");
        break;
    case NS_NETBT:
        wprintf(L"NS_NETBT");
        break;
    case NS_WINS:
        wprintf(L"NS_WINS");
        break;
    case NS_NLA:
        wprintf(L"NS_NLA");
        break;
    case NS_BTH:
        wprintf(L"NS_BTH");
        break;
    case NS_NTDS:
        wprintf(L"NS_NTDS");
        break;
    case NS_EMAIL:
        wprintf(L"NS_EMAIL");
        break;
    case NS_PNRPNAME:
        wprintf(L"NS_PNRPNAME");
        break;
    case NS_PNRPCLOUD:
        wprintf(L"NS_PNRPCLOUD");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L")\n\n");

//--------------------------------
// Call getaddrinfoex(). If the call succeeds,
// the result variable will hold a linked list
// of addrinfo structures containing response
// information
    dwRetval =
        GetAddrInfoEx(argv[1], argv[2], dwNamespace, lpNspid, &hints, &result,
                      NULL, NULL, NULL, NULL);
    if (dwRetval != 0) {
        wprintf(L"GetAddrInfoEx failed with error: %d\n", dwRetval);
        WSACleanup();
        return 1;
    }

    wprintf(L"GetAddrInfoEx returned success\n");

    // Retrieve each address and print out the hex bytes
    for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {

        wprintf(L"GetAddrInfoEx response %d\n", i++);
        wprintf(L"\tFlags: 0x%x\n", ptr->ai_flags);
        wprintf(L"\tFamily: ");
        switch (ptr->ai_family) {
        case AF_UNSPEC:
            wprintf(L"Unspecified\n");
            break;
        case AF_INET:
            wprintf(L"AF_INET (IPv4)\n");
            // the InetNtop function is available on Windows Vista and later
            sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr;
            wprintf(L"\tIPv4 address %ws\n",
                    InetNtop(AF_INET, &sockaddr_ipv4->sin_addr, ipstringbuffer,
                             46));

            // We could also use the WSAAddressToString function
            // 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)
            //    wprintf(L"WSAAddressToString failed with %u\n", WSAGetLastError() );
            // else    
            //    wprintf(L"\tIPv4 address %ws\n", ipstringbuffer);
            break;
        case AF_INET6:
            wprintf(L"AF_INET6 (IPv6)\n");
            // the InetNtop function is available on Windows Vista and later
            sockaddr_ipv6 = (struct sockaddr_in6 *) ptr->ai_addr;
            wprintf(L"\tIPv6 address %ws\n",
                    InetNtop(AF_INET6, &sockaddr_ipv6->sin6_addr,
                             ipstringbuffer, 46));

            // We could also use WSAAddressToString which also returns the scope ID
            // 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)
            //    wprintf(L"WSAAddressToString failed with %u\n", WSAGetLastError() );
            //else    
            //    wprintf(L"\tIPv6 address %ws\n", ipstringbuffer);
            break;
        default:
            wprintf(L"Other %ld\n", ptr->ai_family);
            break;
        }
        wprintf(L"\tSocket type: ");
        switch (ptr->ai_socktype) {
        case 0:
            wprintf(L"Unspecified\n");
            break;
        case SOCK_STREAM:
            wprintf(L"SOCK_STREAM (stream)\n");
            break;
        case SOCK_DGRAM:
            wprintf(L"SOCK_DGRAM (datagram) \n");
            break;
        case SOCK_RAW:
            wprintf(L"SOCK_RAW (raw) \n");
            break;
        case SOCK_RDM:
            wprintf(L"SOCK_RDM (reliable message datagram)\n");
            break;
        case SOCK_SEQPACKET:
            wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)\n");
            break;
        default:
            wprintf(L"Other %ld\n", ptr->ai_socktype);
            break;
        }
        wprintf(L"\tProtocol: ");
        switch (ptr->ai_protocol) {
        case 0:
            wprintf(L"Unspecified\n");
            break;
        case IPPROTO_TCP:
            wprintf(L"IPPROTO_TCP (TCP)\n");
            break;
        case IPPROTO_UDP:
            wprintf(L"IPPROTO_UDP (UDP) \n");
            break;
        default:
            wprintf(L"Other %ld\n", ptr->ai_protocol);
            break;
        }
        wprintf(L"\tLength of this sockaddr: %d\n", ptr->ai_addrlen);
        wprintf(L"\tCanonical name: %s\n", ptr->ai_canonname);

        if (ptr->ai_blob == NULL)
            wprintf(L"\tBlob: (null)\n");
        else    
            wprintf(L"\tLength of the blob: %u\n",
                    (DWORD) ptr->ai_bloblen);

        if (ptr->ai_provider == NULL)
            wprintf(L"\tNamespace provider GUID: (null)\n");
        else {
            iRet =
                StringFromGUID2(*(ptr->ai_provider), (LPOLESTR) & GuidString,
                                39);
            // For c rather than C++ source code, the above line needs to be
            // iRet = StringFromGUID2(&ptr.ai_provider, (LPOLESTR) &GuidString, 39); 
            if (iRet == 0)
                wprintf(L"StringFromGUID2 failed\n");
            else {
                wprintf(L"\tNamespace provider: %ws\n", GuidString);
            }
        }
    }

    FreeAddrInfoEx(result);
    WSACleanup();

    return 0;
}


Contoh berikut menunjukkan cara menggunakan fungsi GetAddrInfoEx asinkron untuk mengatasi nama ke alamat IP..

//
//    This sample demonstrates how to use asynchronous GetAddrInfoEx to
//    resolve a name to an IP address.
//
//    ResolveName <QueryName>
//

#ifndef UNICODE
#define UNICODE
#endif

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

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

#define MAX_ADDRESS_STRING_LENGTH   64

//
//  Asynchronous query context structure.
//

typedef struct _QueryContext
{
    OVERLAPPED      QueryOverlapped;
    PADDRINFOEX     QueryResults;
    HANDLE          CompleteEvent;
}QUERY_CONTEXT, *PQUERY_CONTEXT;

VOID
WINAPI
QueryCompleteCallback(
    _In_ DWORD Error,
    _In_ DWORD Bytes,
    _In_ LPOVERLAPPED Overlapped
    );

int
__cdecl
wmain(
    _In_ int Argc, PWCHAR Argv[]
    )
{
    INT                 Error = ERROR_SUCCESS;
    WSADATA             wsaData;
    BOOL                IsWSAStartupCalled = FALSE;
    ADDRINFOEX          Hints;
    QUERY_CONTEXT       QueryContext;
    HANDLE              CancelHandle = NULL;
    DWORD               QueryTimeout = 5 * 1000; // 5 seconds

    ZeroMemory(&QueryContext, sizeof(QueryContext));

    //
    //  Validate the parameters
    //

    if (Argc != 2)
    {
        wprintf(L"Usage: ResolveName <QueryName>\n");
        goto exit;
    }

    //
    //  All Winsock functions require WSAStartup() to be called first
    //

    Error = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (Error != 0)
    {
        wprintf(L"WSAStartup failed with %d\n", Error);
        goto exit;
    }

    IsWSAStartupCalled = TRUE;

    ZeroMemory(&Hints, sizeof(Hints));
    Hints.ai_family = AF_UNSPEC;

    //
    //  Note that this is a simple sample that waits/cancels a single
    //  asynchronous query. The reader may extend this to support
    //  multiple asynchronous queries.
    //

    QueryContext.CompleteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    if (QueryContext.CompleteEvent == NULL)
    {
        Error = GetLastError();
        wprintf(L"Failed to create completion event: Error %d\n",  Error);
        goto exit;
    }

    //
    //  Initiate asynchronous GetAddrInfoExW.
    //
    //  Note GetAddrInfoEx can also be invoked asynchronously using an event
    //  in the overlapped object (Just set hEvent in the Overlapped object
    //  and set NULL as completion callback.)
    //
    //  This sample uses the completion callback method.
    //

    Error = GetAddrInfoExW(Argv[1],
                           NULL,
                           NS_DNS,
                           NULL,
                           &Hints,
                           &QueryContext.QueryResults,
                           NULL,
                           &QueryContext.QueryOverlapped,
                           QueryCompleteCallback,
                           &CancelHandle);

    //
    //  If GetAddrInfoExW() returns  WSA_IO_PENDING, GetAddrInfoExW will invoke
    //  the completion routine. If GetAddrInfoExW returned anything else we must
    //  invoke the completion directly.
    //

    if (Error != WSA_IO_PENDING)
    {
        QueryCompleteCallback(Error, 0, &QueryContext.QueryOverlapped);
        goto exit;
    }

    //
    //  Wait for query completion for 5 seconds and cancel the query if it has
    //  not yet completed.
    //

    if (WaitForSingleObject(QueryContext.CompleteEvent,
                            QueryTimeout)  == WAIT_TIMEOUT )
    {

        //
        //  Cancel the query: Note that the GetAddrInfoExCancelcancel call does
        //  not block, so we must wait for the completion routine to be invoked.
        //  If we fail to wait, WSACleanup() could be called while an
        //  asynchronous query is still in progress, possibly causing a crash.
        //

        wprintf(L"The query took longer than %d seconds to complete; "
                L"cancelling the query...\n", QueryTimeout/1000);

        GetAddrInfoExCancel(&CancelHandle);

        WaitForSingleObject(QueryContext.CompleteEvent,
                            INFINITE);
    }

exit:

    if (IsWSAStartupCalled)
    {
        WSACleanup();
    }

    if (QueryContext.CompleteEvent)
    {
        CloseHandle(QueryContext.CompleteEvent);
    }

    return Error;
}

//
// Callback function called by Winsock as part of asynchronous query complete
//

VOID
WINAPI
QueryCompleteCallback(
    _In_ DWORD Error,
    _In_ DWORD Bytes,
    _In_ LPOVERLAPPED Overlapped
    )
{
    PQUERY_CONTEXT  QueryContext = NULL;
    PADDRINFOEX     QueryResults = NULL;
    WCHAR           AddrString[MAX_ADDRESS_STRING_LENGTH];
    DWORD           AddressStringLength;

    UNREFERENCED_PARAMETER(Bytes);

    QueryContext = CONTAINING_RECORD(Overlapped,
                                     QUERY_CONTEXT,
                                     QueryOverlapped);

    if (Error != ERROR_SUCCESS)
    {
        wprintf(L"ResolveName failed with %d\n", Error);
        goto exit;
    }

    wprintf(L"ResolveName succeeded. Query Results:\n");

    QueryResults = QueryContext->QueryResults;

    while(QueryResults)
    {
        AddressStringLength = MAX_ADDRESS_STRING_LENGTH;

        WSAAddressToString(QueryResults->ai_addr,
                           (DWORD)QueryResults->ai_addrlen,
                           NULL,
                           AddrString,
                           &AddressStringLength);

        wprintf(L"Ip Address: %s\n", AddrString);
        QueryResults = QueryResults->ai_next;
    }

exit:

    if (QueryContext->QueryResults)
    {
        FreeAddrInfoEx(QueryContext->QueryResults);
    }

    //
    //  Notify caller that the query completed
    //

    SetEvent(QueryContext->CompleteEvent);
    return;
}

Catatan Pastikan bahwa lingkungan pengembangan menargetkan versi terbaru Ws2tcpip.h yang mencakup definisi struktur dan fungsi untuk addrinfoex dan GetAddrInfoEx.
 

Nama Domain Internasional

Nama host internet biasanya terdiri dari sekumpulan karakter yang sangat terbatas:
  • Huruf besar dan kecil ASCII dari alfabet bahasa Inggris.
  • Digit dari 0 hingga 9.
  • Karakter tanda hubung ASCII.

Dengan pertumbuhan Internet, ada kebutuhan yang berkembang untuk mengidentifikasi nama host Internet untuk bahasa lain yang tidak diwakili oleh set karakter ASCII. Pengidentifikasi yang memfasilitasi kebutuhan ini dan memungkinkan karakter non-ASCII (Unicode) direpresentasikan sebagai string karakter ASCII khusus dikenal sebagai Nama Domain Internasional (IDN). Mekanisme yang disebut Internationalisasi Nama Domain dalam Aplikasi (IDNA) digunakan untuk menangani IDN dengan cara standar. Spesifikasi untuk IDN dan IDNA di dokumentasikan dalam RFC 3490, RTF 5890, dan RFC 6365 yang diterbitkan oleh Internet Engineering Task Force (IETF).

Pada Windows 8 dan Windows Server 2012, fungsi GetAddrInfoEx menyediakan dukungan untuk penguraian Nama Domain Internasional (IDN) yang diterapkan pada nama yang diteruskan dalam parameter pName . Winsock melakukan pengodean dan konversi Punycode/IDN. Perilaku ini dapat dinonaktifkan menggunakan bendera AI_DISABLE_IDN_ENCODING yang dibahas di bawah ini.

Pada Windows 7 dan Windows Server 2008 R2 atau yang lebih lama, fungsi GetAddrInfoEx saat ini tidak menyediakan dukungan untuk penguraian IDN yang diterapkan pada nama yang diteruskan dalam parameter pName . Versi karakter lebar fungsi GetAddrInfoEx tidak menggunakan Punycode untuk mengonversi format IDN Punycode sesuai RFC 3490. Versi karakter luas fungsi GetAddrInfoEx saat mengkueri DNS mengodekan nama Unicode dalam format UTF-8, format yang digunakan oleh server DNS Microsoft di lingkungan perusahaan.

Beberapa fungsi pada Windows Vista dan kemudian mendukung konversi antara label Unicode dalam IDN ke setara ASCII mereka. Representasi yang dihasilkan dari setiap label Unicode hanya berisi karakter ASCII dan dimulai dengan awalan xn-- jika label Unicode berisi karakter non-ASCII. Alasan untuk ini adalah untuk mendukung server DNS yang ada di Internet, karena beberapa alat dan server DNS hanya mendukung karakter ASCII (lihat RFC 3490).

Fungsi IdnToAscii menggunakan Punycode untuk mengonversi IDN ke representasi ASCII dari string Unicode asli menggunakan algoritma standar yang ditentukan dalam RFC 3490. Fungsi IdnToUnicode mengonversi bentuk ASCII dari IDN ke sintaks pengodean Unicode UTF-16 normal. Untuk informasi selengkapnya dan tautan ke standar draf terkait, lihat Menangani Nama Domain Internasional (IDN).

Fungsi IdnToAscii dapat digunakan untuk mengonversi nama IDN ke formulir ASCII yang kemudian dapat diteruskan dalam parameter pName ke fungsi GetAddrInfoEx ketika versi ASCII fungsi ini digunakan (ketika UNICODE dan _UNICODE tidak ditentukan). Untuk meneruskan nama IDN ini ke fungsi GetAddrInfoEx saat versi karakter lebar fungsi ini digunakan (ketika UNICODE atau _UNICODE ditentukan), Anda dapat menggunakan fungsi MultiByteToWideChar untuk mengonversi string CHAR menjadi string WCHAR .

Penggunaan ai_flags dalam parameter petunjuk

Bendera di ai_flags anggota struktur addrinfoex opsional yang disediakan dalam parameter petunjuk mengubah perilaku fungsi.

Bit bendera ini didefinisikan dalam file header Ws2def.h pada Microsoft Windows Software Development Kit (SDK) untuk Windows 7. Bit bendera ini ditentukan dalam file header Ws2tcpip.h pada Windows SDK untuk Windows Server 2008 dan Windows Vista. Bit bendera ini didefinisikan dalam file header Ws2tcpip.h pada Platform Software Development Kit (SDK) untuk Windows Server 2003, dan Windows XP.

Bit bendera dapat berupa kombinasi dari yang berikut ini:

Bit Bendera Deskripsi
AI_PASSIVE Mengatur bendera AI_PASSIVE menunjukkan pemanggil berniat menggunakan struktur alamat soket yang dikembalikan dalam panggilan ke fungsi ikatan . Ketika bendera AI_PASSIVE diatur dan pName adalah penunjuk NULL , bagian alamat IP dari struktur alamat soket diatur ke INADDR_ANY untuk alamat IPv4 dan IN6ADDR_ANY_INIT untuk alamat IPv6.

Ketika bendera AI_PASSIVE tidak diatur, struktur alamat soket yang dikembalikan siap untuk panggilan ke fungsi sambungkan untuk protokol berorientasi koneksi, atau siap untuk panggilan ke fungsi sambungkan, kirim, atau kirim untuk protokol tanpa koneksi. Jika parameter pName adalah penunjuk NULL dalam hal ini, bagian alamat IP dari struktur alamat soket diatur ke alamat loopback.

AI_CANONNAME Jika tidak AI_CANONNAME atau AI_NUMERICHOST digunakan, fungsi GetAddrInfoEx mencoba resolusi. Jika string literal diteruskan GetAddrInfoEx mencoba mengonversi string, dan jika nama host diteruskan fungsi GetAddrInfoEx mencoba untuk menyelesaikan nama ke alamat atau beberapa alamat.

Ketika bit AI_CANONNAME diatur, parameter pName tidak boleh NULL. Jika tidak, fungsi GetAddrInfoEx akan gagal dengan WSANO_RECOVERY.

Ketika bit AI_CANONNAME diatur dan fungsi GetAddrInfoEx mengembalikan keberhasilan, anggota ai_canonname dalam parameter ppResult menunjuk ke string yang dihentikan NULL yang berisi nama kanonis simpul yang ditentukan.

Catatan Fungsi GetAddrInfoEx dapat mengembalikan keberhasilan ketika bendera AI_CANONNAME diatur, namun anggota ai_canonname dalam struktur addrinfo terkait adalah NULL. Oleh karena itu, penggunaan bendera AI_CANONNAME yang direkomendasikan mencakup pengujian apakah anggota ai_canonname dalam struktur addrinfoex terkait adalah NULL.
 
AI_NUMERICHOST Saat bit AI_NUMERICHOST diatur, parameter pName harus berisi string alamat host numerik non-NULL , jika tidak, kesalahan EAI_NONAME dikembalikan. Bendera ini mencegah layanan resolusi nama dipanggil.
AI_NUMERICSERV Ketika bit AI_NUMERICSERV diatur, parameter pServiceName harus berisi nomor port numerik non-NULL, jika tidak, kesalahan EAI_NONAME dikembalikan. Bendera ini mencegah layanan resolusi nama dipanggil.

Bendera AI_NUMERICSERV ditentukan pada Windows SDK untuk Windows Vista dan yang lebih baru. Bendera AI_NUMERICSERV tidak didukung oleh penyedia Microsoft.

AI_ALL Jika bit AI_ALL diatur, permintaan dibuat untuk alamat IPv6 dan alamat IPv4 dengan AI_V4MAPPED.

Bendera AI_ALL ditentukan pada Windows SDK untuk Windows Vista dan yang lebih baru. Bendera AI_ALL didukung pada Windows Vista dan yang lebih baru.

AI_ADDRCONFIG Jika bit AI_ADDRCONFIG diatur, GetAddrInfoEx hanya akan diselesaikan jika alamat global dikonfigurasi. Jika bendera AI_ADDRCONFIG ditentukan, alamat IPv4 akan dikembalikan hanya jika alamat IPv4 dikonfigurasi pada sistem lokal, dan alamat IPv6 akan dikembalikan hanya jika alamat IPv6 dikonfigurasi pada sistem lokal. Alamat loopback IPv4 atau IPv6 tidak dianggap sebagai alamat global yang valid.

Bendera AI_ADDRCONFIG ditentukan pada Windows SDK untuk Windows Vista dan yang lebih baru. Bendera AI_ADDRCONFIG didukung pada Windows Vista dan yang lebih baru.

AI_V4MAPPED Jika bit AI_V4MAPPED diatur dan permintaan untuk alamat IPv6 gagal, permintaan layanan nama dibuat untuk alamat IPv4 dan alamat ini dikonversi ke format alamat IPv6 yang dipetakan IPv4.

Bendera AI_V4MAPPED ditentukan pada Windows SDK untuk Windows Vista dan yang lebih baru. Bendera AI_V4MAPPED didukung pada Windows Vista dan yang lebih baru.

AI_NON_AUTHORITATIVE Jika bit AI_NON_AUTHORITATIVE diatur, penyedia namespace NS_EMAIL mengembalikan hasil otoritatif dan non-otoritatif. Jika bit AI_NON_AUTHORITATIVE tidak diatur, penyedia namespace NS_EMAIL hanya mengembalikan hasil otoritatif.

Bendera AI_NON_AUTHORITATIVE ditentukan pada Windows SDK untuk Windows Vista dan yang lebih baru. Bendera AI_NON_AUTHORITATIVE didukung pada Windows Vista dan yang lebih baru dan hanya berlaku untuk namespace NS_EMAIL .

AI_SECURE Jika bit AI_SECURE diatur, penyedia namespace NS_EMAIL akan mengembalikan hasil yang diperoleh dengan keamanan yang ditingkatkan untuk meminimalkan kemungkinan spoofing.

Bendera AI_SECURE ditentukan pada Windows SDK untuk Windows Vista dan yang lebih baru. Bendera AI_SECURE didukung pada Windows Vista dan yang lebih baru dan hanya berlaku untuk namespace NS_EMAIL .

AI_RETURN_PREFERRED_NAMES Jika AI_RETURN_PREFERRED_NAMES diatur, maka tidak ada nama yang harus disediakan dalam parameter pName . Penyedia namespace NS_EMAIL akan mengembalikan nama pilihan untuk publikasi.

Bendera AI_RETURN_PREFERRED_NAMES ditentukan pada Windows SDK untuk Windows Vista dan yang lebih baru. Bendera AI_RETURN_PREFERRED_NAMES didukung pada Windows Vista dan yang lebih baru dan hanya berlaku untuk namespace NS_EMAIL .

AI_FQDN Jika AI_FQDN diatur dan nama datar (label tunggal) ditentukan, GetAddrInfoEx akan mengembalikan nama domain yang sepenuhnya memenuhi syarat yang akhirnya diselesaikan oleh nama tersebut. Nama domain yang sepenuhnya memenuhi syarat dikembalikan dalam anggota ai_canonname dalam struktur addrinfoex terkait. Ini berbeda dari bendera bit AI_CANONNAME yang mengembalikan nama kanonis yang terdaftar di DNS yang mungkin berbeda dari nama domain yang sepenuhnya memenuhi syarat yang diselesaikan oleh nama datar.

Ketika bit AI_FQDN diatur, parameter pName tidak boleh NULL. Jika tidak, fungsi GetAddrInfoEx akan gagal dengan WSANO_RECOVERY.

Pada Windows 8 dan Windows Server 2012, bit AI_FQDN dan AI_CANONNAME dapat diatur. Jika fungsi GetAddrInfoEx dipanggil dengan bit AI_FQDN dan AI_CANONNAME , parameter ppResult mengembalikan penunjuk ke struktur addrinfoex2 , bukan struktur addrinfoex .

Pada Windows 7 dan Windows Server 2008 R2, hanya salah satu bit AI_FQDN dan AI_CANONNAME yang dapat diatur. Fungsi GetAddrInfoEx akan gagal jika kedua bendera ada dengan EAI_BADFLAGS.

Windows 7: Bendera AI_FQDN ditentukan pada Windows SDK untuk Windows 7 dan yang lebih baru. Bendera AI_FQDN didukung pada Windows 7 dan yang lebih baru.

AI_FILESERVER Jika AI_FILESERVER diatur, ini adalah petunjuk ke penyedia namespace layanan bahwa nama host yang dikueri sedang digunakan dalam skenario berbagi file. Penyedia namespace mungkin mengabaikan petunjuk ini.

Windows 7: Bendera AI_FILESERVER ditentukan pada Windows SDK untuk Windows 7 dan yang lebih baru. Bendera AI_FILESERVER didukung pada Windows 7 dan yang lebih baru.

AI_DISABLE_IDN_ENCODING Jika AI_DISABLE_IDN_ENCODING diatur, ini menonaktifkan pengodean Nama Domain Internasional otomatis menggunakan Punycode dalam fungsi resolusi nama yang disebut oleh fungsi GetAddrInfoEx .

Windows 8: Bendera AI_DISABLE_IDN_ENCODING ditentukan pada Windows SDK untuk Windows 8 dan yang lebih baru. Bendera AI_DISABLE_IDN_ENCODING didukung pada Windows 8 dan yang lebih baru.

 

Catatan

Header ws2tcpip.h mendefinisikan GetAddrInfoEx sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta praprosem UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2008 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header ws2tcpip.h
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

FreeAddrInfoEx

GetAddrInfoExCancel

GetAddrInfoExOverlappedResult

GetAddrInfoW

IdnToAscii

IdnToUnicode

WSAEnumNameSpaceProviders

WSAGetLastError

Kode Kesalahan Windows Sockets

addrinfoex

addrinfoex2

gai_strerror

getaddrinfo