dns开始使用dns


备注

域名系统(DNS)是分层的 分布式全局数据库,最常用于将主机名映射到它们各自的IP地址。它在RFC 1034RFC 1035中定义,并且有许多更新。

域名是由句点字符( . )分隔的标签序列。每个标签最多可包含63个字符,域名最多可包含255个字符。

DNS通常被描述为树结构,其中“根区域”位于顶部,顶级域名(TLD)例如comuk等位于其下方,等等。在域名中,标签以“小”显示endian“叶子节点标签出现最左边的顺序,TLD出现在最右边。如果在TLD之后出现跟踪期,那么该名称将被称为完全限定域名 ,其中尾随时段表示根区域本身。

在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);
}