在 C 中執行名稱查詢

getaddrinfo() 功能是推薦的 POSIX 功能,用於連線系統解析器。根據系統配置,它將在 DNS,/etc/hosts,mDNS 等中執行名稱查詢。

它優於已棄用的 gethostbyname() 系列函式,因為它支援 IPv4 和 IPv6 定址,並且還可以同時執行服務名稱查詢(例如,將 http 對映到埠 80)

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

...

struct addrinfo hints;
struct addrinfo *result;
int r;

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;           // allow IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM;       // make a stream (TCP) connection

r = getaddrinfo(hostname, "http", &hints, &result);
if (r != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(r));
} else {
    // iterate over the linked list
    for (struct addrinfo *rp = result; rp != NULL; rp = rp->ai_next) {
        // use rp fields to create a socket and connect to it 
    }
    freeaddrinfo(result);
}