新聞中心
用Linux C實(shí)現(xiàn)高效DNS解析

創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),博山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:博山等地區(qū)。博山做網(wǎng)站價(jià)格咨詢:18980820575
DNS(Domn Name System)是指將域名轉(zhuǎn)換成IP地址,以便讓計(jì)算機(jī)之間相互訪問的技術(shù)。查找域名對(duì)應(yīng)的IP地址是網(wǎng)絡(luò)通信的基礎(chǔ),因此DNS解析的速度和效率對(duì)于計(jì)算機(jī)的運(yùn)行和網(wǎng)絡(luò)的流暢度有著至關(guān)重要的影響。本文將介紹如何使用Linux C實(shí)現(xiàn)高效的DNS解析。
一、DNS解析的基本原理
DNS解析的基本原理是將域名解析成一個(gè)可用的IP地址,使計(jì)算機(jī)之間可以通過IP地址訪問對(duì)方。例如,當(dāng)我們?cè)跒g覽器中輸入www.google.com時(shí),瀏覽器會(huì)向DNS服務(wù)器發(fā)出請(qǐng)求,詢問域名www.google.com對(duì)應(yīng)的IP地址是多少。DNS服務(wù)器會(huì)返回一個(gè)IP地址(例如172.217.25.68),瀏覽器通過該IP地址就可以連接到Google網(wǎng)站。
DNS服務(wù)器通常由ISP或企業(yè)或組織自己維護(hù),可以是一臺(tái)或多臺(tái)。DNS服務(wù)器通常存儲(chǔ)了所有域名和對(duì)應(yīng)的IP地址,因此DNS解析是一個(gè)非常重要和繁瑣的工作。
二、Linux系統(tǒng)中常用的DNS解析方法
在Linux系統(tǒng)中,常用的DNS解析方法有以下幾種:
1. gethostbyname()函數(shù)
gethostbyname()函數(shù)是C語言中用于DNS解析的函數(shù),使用較為簡單,但效率不高。該函數(shù)的使用方式如下:
“`c
#include
struct hostent *gethostbyname(const char *name);
“`
在使用該函數(shù)時(shí),需要注意該函數(shù)返回的結(jié)構(gòu)體中并不包含TTL信息,因此無法判斷該解析結(jié)果是否過期。此外,由于gethostbyname()函數(shù)會(huì)阻塞進(jìn)程,因此需要單獨(dú)開辟線程進(jìn)行DNS解析。
2. 解析配置文件/etc/hosts
在Linux系統(tǒng)中,/etc/hosts文件是用于本地DNS解析的文件,存儲(chǔ)了一些常用的域名和對(duì)應(yīng)的IP地址,例如:
“`
127.0.0.1 localhost
127.0.0.1 mydomn
“`
在訪問mydomn時(shí),系統(tǒng)會(huì)首先去/etc/hosts文件中查找mydomn對(duì)應(yīng)的IP地址,如果找到則直接使用該IP地址進(jìn)行訪問。由于/etc/hosts文件是本地存儲(chǔ)的,因此不涉及網(wǎng)絡(luò)通信,可以提升一定的解析速度。
3. 使用DNS緩存
由于DNS解析過程存在重復(fù)性,因此在Linux系統(tǒng)中可以使用DNS緩存提升解析速度。DNS緩存通常是指本地主機(jī)上對(duì)查詢到的IP地址進(jìn)行緩存,以便下次查詢時(shí)可以直接讀取緩存中的IP地址,從而避免了網(wǎng)絡(luò)通信的開銷。Linux系統(tǒng)中可以使用dnasq等DNS軟件來實(shí)現(xiàn)DNS緩存。
三、使用Linux C實(shí)現(xiàn)高效DNS解析
由于gethostbyname()函數(shù)的效率較低,因此本文將介紹如何使用Linux C實(shí)現(xiàn)一種高效的DNS解析方法。該方法的主要思路是通過獲取DNS服務(wù)器的IP地址,手動(dòng)向DNS服務(wù)器發(fā)起查詢,從而提升解析效率。下面是具體的實(shí)現(xiàn)步驟:
1. 獲取DNS服務(wù)器的IP地址
在Linux系統(tǒng)中,DNS服務(wù)器的IP地址通常存儲(chǔ)在/etc/resolv.conf文件中,該文件中包含了域名解析的配置信息??梢允褂靡韵麓a來獲取DNS服務(wù)器的IP地址:
“`c
#include
#include
int get_dns_server(char *buf, int len) {
FILE *f = fopen(“/etc/resolv.conf”, “r”);
if (!f) {
return -1;
}
char line[1024];
while (fgets(line, sizeof(line), f)) {
if (line[0] == ‘#’ || line[0] == ‘\n’) {
continue;
}
if (!strncmp(line, “nameserver”, 10)) {
char *p = strtok(line + 10, ” \t\n”);
if (!p) {
continue;
}
struct in_addr addr;
addr.s_addr = inet_addr(p);
if (addr.s_addr == INADDR_NONE) {
continue;
}
strncpy(buf, p, len – 1);
buf[len – 1] = ‘\0’;
break;
}
}
fclose(f);
if (buf[0] == ‘\0’) {
return -1;
}
return 0;
}
“`
上述代碼中,get_dns_server()函數(shù)通過打開/etc/resolv.conf文件來查找DNS服務(wù)器的IP地址。由于/etc/resolv.conf文件中可能存在多個(gè)DNS服務(wù)器,因此該函數(shù)僅返回查找到的之一個(gè)DNS服務(wù)器的IP地址。
2. 向DNS服務(wù)器發(fā)起查詢
獲取DNS服務(wù)器的IP地址之后,需要向該DNS服務(wù)器發(fā)起DNS查詢請(qǐng)求。DNS查詢請(qǐng)求是一種不同于TCP和UDP的協(xié)議,需要使用RAW Socket進(jìn)行開發(fā)。
RAW Socket是指可以自定義協(xié)議頭的Socket,在Linux系統(tǒng)中可以創(chuàng)建自定義協(xié)議的Socket,從而實(shí)現(xiàn)DNS查詢請(qǐng)求。以下是創(chuàng)建RAW Socket的代碼示例:
“`c
#include
#include
#include
#include
int create_raw_socket(void) {
int fd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
if (fd == -1) {
return -1;
}
int opt = 1;
if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) == -1) {
close(fd);
return -1;
}
return fd;
}
“`
上述代碼中,create_raw_socket()函數(shù)使用Socket協(xié)議創(chuàng)建了一個(gè)UDP Socket,并通過setsockopt()函數(shù)設(shè)置了IP_HDRINCL選項(xiàng),該選項(xiàng)指示內(nèi)核使用應(yīng)用程序提供的IP包頭,從而實(shí)現(xiàn)自定義的協(xié)議頭。
調(diào)用create_raw_socket()函數(shù)之后,就可以使用sendto()函數(shù)向DNS服務(wù)器發(fā)起查詢請(qǐng)求,然后使用recvfrom()函數(shù)接收DNS服務(wù)器返回的IP地址信息,從而完成DNS解析過程了。完整的高效DNS解析代碼如下:
“`c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DNS_SERVER_PORT 53
#define DNS_SERVER_ADDR “8.8.8.8”
#define DNS_CLIENT_PORT 5353
#define DNS_CLIENT_ADDR “0.0.0.0”
struct dns_header {
unsigned short id;
unsigned short flags;
unsigned short qdcount; // Question Count
unsigned short ancount; // Answer Count
unsigned short nscount; // Authority Count
unsigned short arcount; // Additional Count
};
struct dns_query {
unsigned short qtype;
unsigned short qclass;
};
int create_raw_socket(void);
int get_dns_server(char *buf, int len);
int send_dns_query(int fd, const char *domn, const char *server);
int resolve_dns_response(const char *buf, size_t buflen);
int mn(int argc, char **argv) {
if (argc
printf(“Usage: %s domn_name\n”, argv[0]);
exit(0);
}
int sock = create_raw_socket();
if (sock == -1) {
perror(“create_raw_socket”);
exit(1);
}
char dns_server[16];
if (get_dns_server(dns_server, sizeof(dns_server)) == -1) {
strncpy(dns_server, DNS_SERVER_ADDR, sizeof(dns_server) – 1);
}
if (send_dns_query(sock, argv[1], dns_server) == -1) {
perror(“send_dns_query”);
close(sock);
exit(1);
}
char buf[1024];
ssize_t n = recvfrom(sock, buf, sizeof(buf), 0, NULL, NULL);
if (n == -1) {
perror(“recvfrom”);
close(sock);
exit(1);
}
int ret = resolve_dns_response(buf, n);
close(sock);
return ret;
}
int create_raw_socket(void) {
int fd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
if (fd == -1) {
return -1;
}
int opt = 1;
if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) == -1) {
close(fd);
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(DNS_CLIENT_PORT);
addr.sin_addr.s_addr = inet_addr(DNS_CLIENT_ADDR);
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
close(fd);
return -1;
}
return fd;
}
int get_dns_server(char *buf, int len) {
FILE *f = fopen(“/etc/resolv.conf”, “r”);
if (!f) {
return -1;
}
char line[1024];
while (fgets(line, sizeof(line), f)) {
if (line[0] == ‘#’ || line[0] == ‘\n’) {
continue;
}
if (!strncmp(line, “nameserver”, 10)) {
char *p = strtok(line + 10, ” \t\n”);
if (!p) {
continue;
}
struct in_addr addr;
addr.s_addr = inet_addr(p);
if (addr.s_addr == INADDR_NONE) {
continue;
}
strncpy(buf, p, len – 1);
buf[len – 1] = ‘\0’;
break;
}
}
fclose(f);
if (buf[0] == ‘\0’) {
return -1;
}
return 0;
}
int send_dns_query(int fd, const char *domn, const char *server) {
size_t len = strlen(domn);
char *buf = (char *)malloc(sizeof(struct dns_header) + len + 2 + sizeof(struct dns_query));
memset(buf, 0, sizeof(struct dns_header) + len + 2 + sizeof(struct dns_query));
struct dns_header *hdr = (struct dns_header *)buf;
hdr->id = htons(rand() % 65536);
hdr->flags = htons(0x0100); // Standard query
hdr->qdcount = htons(1);
char *pos = buf + sizeof(struct dns_header);
memcpy(pos, domn, len + 1);
for (char *p = pos; *p; ++p) {
if (*p == ‘.’) {
*p = p – pos;
} else {
++*p;
}
}
struct dns_query *qry = (struct dns_query *)(pos + len + 1);
qry->qtype = htons(1); // A record
qry->qclass = htons(1); // IN (Internet)
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(DNS_SERVER_PORT);
addr.sin_addr.s_addr = inet_addr(server);
ssize_t n = sendto(fd, buf, sizeof(struct dns_header) + len + 2 + sizeof(struct dns_query), 0, (struct sockaddr *)&addr, sizeof(addr));
free(buf);
return (n == -1) ? -1 : 0;
}
int resolve_dns_response(const char *buf, size_t buflen) {
struct dns_header *hdr = (struct dns_header *)buf;
size_t len = ntohs(hdr->qdcount);
if (len == 0) {
printf(“Invalid DNS response: %d\n”, len);
return -1;
}
char *pos = (char *)(buf + sizeof(struct dns_header));
for (size_t i = 0; i
pos += strlen(pos) + 1 + sizeof(struct dns_query);
}
if (pos >= buf + buflen) {
printf(“Invalid DNS response: %p – %p\n”, pos, buf + buflen);
return -1;
}
printf(“%d.%d.%d.%d\n”, pos[0], pos[1], pos[2], pos[3]);
return 0;
}
“`
四、注意事項(xiàng)
使用該方法進(jìn)行DNS解析時(shí),需要注意以下幾點(diǎn):
1. DNS服務(wù)器的IP地址可能會(huì)變動(dòng),因此應(yīng)該定期更新/etc/resolv.conf文件來及時(shí)更新DNS服務(wù)器的IP地址。
2. DNS查詢請(qǐng)求需要使用RAW Socket,因此需要通過root權(quán)限運(yùn)行程序。
3. DNS服務(wù)器返回的IP地址可能會(huì)存在多種情況,例如多個(gè)IP地址一起返回(例如cname記錄),因此需要對(duì)DNS服務(wù)器返回的信息進(jìn)行解析。
相關(guān)問題拓展閱讀:
- linux下如何配置DNS服務(wù)器,
- 寫一個(gè)C語言程序: 能修改Linux 主機(jī)的IP、DHCP、DNS 等設(shè)置
linux下如何配置DNS服務(wù)器,
答案給出的很詳細(xì),可是那是老版本redhat9的配置了。 現(xiàn)在通用的bind9.0使用的是chroot環(huán)境,就是說你安裝RHEL5.4的時(shí)候,在/etc/下面是找不到named.conf文件的.簡要說下過程 如果你用的RHEL5的yum庫1.安裝#yum install bind* -y#yum install caching-nameserver2.配置主配文件#cd /var/named/chroot/etc/ #cp -a named.caching-nameserver.conf named.conf# vim named.conf主游雀要參饑磨滾數(shù)和以前的bind差不多,都爛余是寫明正向和方向域文件。allow-query 這行要匹配any 否則服務(wù)器就只能你本地使用
linux DNS服務(wù)器配置
基本理論:
DNS系統(tǒng)的作用是把域名和IP對(duì)應(yīng)起來。
正向解析:根據(jù)域名(主機(jī)名)查找對(duì)應(yīng)的IP地址。
反向解析:根據(jù)IP地址查詢對(duì)應(yīng)的域名(主機(jī)名)。
查詢
遞歸查詢:大多數(shù)客戶機(jī)向蘆前DNS服務(wù)器解析域名的方式。
迭代查詢:大多數(shù)DNS服務(wù)器向其它DNS服務(wù)器解析域名的方式。
DNS服務(wù)器的類型
緩存域名服務(wù)器:也稱唯高速緩存服務(wù)器。通過向其它域名服務(wù)器查詢獲得域名與IP地址的對(duì)應(yīng)孫伏記錄,將域名查詢結(jié)果緩存到本地,提高重復(fù)查詢時(shí)的速度。
主域名服務(wù)器:特定DNS區(qū)域的官方服務(wù)器陪凱清,具有唯一性。負(fù)責(zé)維護(hù)該區(qū)域內(nèi)的所有域名與IP的映射記錄。
從域名服務(wù)器:也稱輔助域名服務(wù)器。其維護(hù)的域名與IP地址的映射記錄來源于主域名服務(wù)器。
環(huán)境準(zhǔn)備:
臨時(shí)關(guān)閉selinux和iptables
#setenforce 0
#service iptables stop
查詢相關(guān)軟件包:
# yum search bind
Loaded plugins: product-id, refresh-packagekit, subscription-manager
Updating Red Hat repositories.
====================================================================================== N/S Matched: bind ======================================================================================
PackageKit-device-rebind.i686 : Device rebind functionality for PackageKit
bind.i686 : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
bind-chroot.i686 : A chroot runtime environment for the ISC BIND DNS server, named(8)
bind-utils.i686 : Utilities for querying DNS name servers
其中各軟件包的作用如下:
bind: 提供域名服務(wù)的主要程序及相關(guān)文件。
bind-chroot:為bind提供一個(gè)偽裝的根目錄以增強(qiáng)安全性。
bind-utils:提供對(duì)DNS服務(wù)器測試的工具程序(如nslookup、dig等)。
安裝BIND軟件包#yum install *bind*
配置DNS服務(wù)器:
bind服務(wù)器端程序
主要執(zhí)行程序:/usr/in/named
服務(wù)腳本:、etc/init.d/named
默認(rèn)監(jiān)聽端口:53
主配置文件: /etc/named.conf
保存DNS解析記錄的數(shù)據(jù)文件: /var/named/chroot/var/named
查詢bind程序的配置文件列表
# rpm -qc bind
/etc/logrotate.d/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback
查看主配置文件named.conf
#vim /etc/named.conf
主配置文件解析:
全局配置部分:
默認(rèn)的全局配置項(xiàng)如下:
10 options {
listen-on port 53 { 127.0.0.1; }; //監(jiān)聽的端口和接口IP地址
listen-on-v6 port 53 { ::1; };
directory”/var/named”;//dns區(qū)域的數(shù)據(jù)文件默認(rèn)存放位置
dump-file”/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
memstatistics-file “/var/named/data/named_mem_stats.txt”;
allow-query { localhost; }; //允許dns查詢的客戶機(jī)列表,any表示所有
recursion yes;//是否允許客戶機(jī)進(jìn)行遞歸查詢
19
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
23
/* Path to ISC DLV key */
bindkeys-file “/etc/named.iscdlv.key”;
26 };
全局配置中還有如下選項(xiàng):
forwarders {202.102.24.68;12.3.3.3;};//將本域名服務(wù)器不能解析的條目轉(zhuǎn)發(fā)給其它DNS服務(wù)器的IP地址
默認(rèn)的區(qū)域配置項(xiàng)如下:
35 zone “.” IN {
type hint; //區(qū)域類型。hint為根區(qū)域;master為主區(qū)域; slave為輔助區(qū)域
file “named.ca”;//該區(qū)域?qū)?yīng)的區(qū)域數(shù)據(jù)配置文件名
38 };
區(qū)域配置中還有如下選項(xiàng):
allow-transfer {189.98.90.23;};//允許下載區(qū)域數(shù)據(jù)庫的從域名服務(wù)器IP地址
allow-update {none;};//允許動(dòng)態(tài)更新的客戶端IP地址(none表示全部禁止)
添加如下區(qū)域配置:
zone “my.com” IN {
type master;//主區(qū)域
file “my.com”; //該區(qū)域?qū)?yīng)的區(qū)域數(shù)據(jù)配置文件名
allow-transfer {192.168.153.1;};//允許下載區(qū)域數(shù)據(jù)庫的從域名服務(wù)器IP地址
allow-update {none;};
};
zone “153.168.192.in-addr.arpa” IN { //表示針對(duì)IP192.168.153.130反向解析
type master;//主區(qū)域
file “192.168.153.my.arpa”;//該區(qū)域?qū)?yīng)的區(qū)域數(shù)據(jù)配置文件名
};
配置完了,可以執(zhí)行如下命令對(duì)named.conf文件進(jìn)行語法檢查。
#named-checkconf
注意:倒序網(wǎng)絡(luò)地址.in-addr.arpa 表示反向區(qū)域
主配置文件最后還有一行是:
include “/etc/named.rfc1912.zones”//該文件包含/etc/named.rfc1912.zones文件
區(qū)域數(shù)據(jù)配置文件:
先看一下named.localhost的內(nèi)容:
$TTL 1D//time to live 生存時(shí)間
@IN SOA @ rname.invalid. ( //”rname.invalid”DNS區(qū)域地址
; serial //更新序列號(hào)
D ; refresh //更新時(shí)間
H ; retry //重試延時(shí)
W ; expire //失效時(shí)間
H ) ; minimum//無效地址解析記錄的默認(rèn)緩存時(shí)間
NS @//name server 域名服務(wù)記錄
A.0.0. //address 只用在正向解析的區(qū)域數(shù)據(jù)文件中
AAAA ::1
新建2個(gè)對(duì)應(yīng)的區(qū)域數(shù)據(jù)配置文件:
#touch my.com
#touch 192.168.153.my.arpa
#vim my.com
$TTL 86400
@ IN SOA my.com. admin.my.com (//admin.myNaN為該區(qū)域管理員的郵箱地址
201
H
M
W
D
)
@IN NS ns1.my.com.//當(dāng)前域的DNS服務(wù)器地址
IN MXmail.my.com.//用于設(shè)置當(dāng)前域的郵件服務(wù)器域名地址,數(shù)字10表示優(yōu)先級(jí)別,數(shù)字越大優(yōu)先級(jí)越低
ns1 IN A.168.153.130
mail IN A.168.153.130
www IN A.168.153.130
ftp IN CNAME www //CNAME別名(canonical name)記錄,表示ftp.my.com和
www.my.com
對(duì)應(yīng)同一個(gè)IP.
# vim 192.168.153.my.arpa
$TTL 86400
@ IN SOA my.com. admin.my.com (
201
H
M
W
D
)
@IN NS ns1.my.com.
INPTR ftp.my.com
啟動(dòng)DNS服務(wù)
# service named start
測試:
配置一臺(tái)ftp服務(wù)器用于測試:
#service vsftpd start//啟動(dòng)vsftpd服務(wù)
當(dāng)前網(wǎng)卡的配置:
eth0: 192.168.0.1/24
eth1: 192.168.153.130/24
# nslookup 192.168.153.130
Server: 127.0.0.1
Address: 127.0.0.1#53
130.153.168.192.in-addr.arpaname =
www.my.com
.
# nslookup ftp.my.com
Server: 127.0.0.1
Address: 127.0.0.1#53
ftp.my.comcanonical name =
www.my.com
.
Name:
www.my.com
Address: 192.168.153.130
測試成功
在linux下配置DNS服務(wù)器,下面是配置過程中設(shè)置過的一些文件,
/etc/hosts 文件的具體內(nèi)容如下:
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost fc4
192.168.1.3 a.test.com a
192.168.1.1 b.test.cn b
/etc/host.conf 文件:
order hosts,bind
表示先用hosts文件做解析,春改在用DNS解析
/etc/resolv.conf 文件:
; generated by NetworkManager, do not edit!
search test.com
nameserver 127.0.0.1
search test.cn
扒談判 nameserver 192.168.1.1
nameserver 61.144.56.100
/etc/named.conf 文侍氏件:
//
// named.conf for Red Hat caching-nameserver
//
options {
directory “/var/named”;
dump-file “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
zone “.” IN {
type hint;
file “named.ca”;
};
zone “test.com”IN {
type master;
file “test.com”;
allow-update { none; };
};
zone “1.168.192.in-addr.arpa”IN {
type master;
file “192.168.1.rev”;
allow-update { none; };
};
zone “test.cn”IN {
type master;
file “test.cn”;
allow-update { none; };
};
zone “0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa” IN {
type master;
file “named.ip6.local”;
allow-update { none; };
};
zone “255.in-addr.arpa” IN {
type master;
file “named.broadcast”;
allow-update { none; };
};
zone “0.in-addr.arpa” IN {
type master;
file “named.zero”;
allow-update { none; };
};
include “/etc/rndc.key”;
在/var/name/test.com 文件下:
$TTL
@ IN SOA a.test.com. root.a.test.com (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS a.test.com.
IN MX 10 mail.test.com.
a IN A 192.168.1.3
mail IN A 192.168.1.3
//其中root.a.test.com的含義是管理員的郵箱
/var/name/test.cn 文件下:
$TTL
@ IN SOA b.test.cn. root.a.test.com (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS b.test.cn.
IN MX 10 mail.test.cn.
b IN A 192.168.1.1
mail IN A 192.168.1.1
/var/name/192.168.1.rev 文件下:
$TTL
@ IN SOA 1.168.192.in-addr.arpa. root.test.com. (
; Serial
; Refresh
; Retry
; Expire
) ; Minimum
IN NS a.test.com.
IN NS b.test.cn.
IN MX 10 mail.test.com.
IN MX 10 mail.test.cn.
3 IN PTR a.test.com.
3 IN PTR mail.test.com.
1 IN PTR b.test.cn.
1 IN PTR mail.test.cn.
然后用/etc/init.d/named restart重啟DNS服務(wù),在重啟過程中,我曾經(jīng)出現(xiàn)過好幾次的錯(cuò)誤,按照出錯(cuò)的提示,會(huì)提示是named.conf文件第幾行出錯(cuò)的。或者提示在那些包含文件例如test.cn這些文件里面的問題,然后一個(gè)一個(gè)排除。
最后還有一些nslookup的命令比較有用:
set all用于顯示使用nslookup工具這臺(tái)機(jī)器上的DNS服務(wù)器的一些信息
set type=any會(huì)顯示完整信息包括域中郵件服務(wù)器和主從DNS服務(wù)器的名字和IP地址
server 192.168.0.1更換查詢的DNS服務(wù)器地址
寫一個(gè)C語言程序: 能修改Linux 主機(jī)的IP、DHCP、DNS 等設(shè)置
5月8日
21:10
dns所要的包:
bind-*
bind-devel-*
bind-utils-*
caching-nameserver-*
redhat-config-bind-*
具體在那張盤我就記不太清楚了,你可枝侍侍以放進(jìn)去試,反正總共才3張盤。
關(guān)于linux安裝程序,比windows要猛吵復(fù)雜一點(diǎn),一般的就是執(zhí)行一個(gè)configure腳本,但是不是每個(gè)軟件都是這么安裝,你可以看一下包內(nèi)的readme.txt,或
readme.txt文件,你們一定有詳細(xì)的添談畢加刪除應(yīng)用軟件的步驟。
可以調(diào)用system()函圓中數(shù)。把linux系統(tǒng)命令拼成字符串,然后調(diào)用system去執(zhí)行這個(gè)字符串就可以了。修改系統(tǒng)配置,需要root身份。
1、system函數(shù):
原型:int
system(const
char
*
command);
功能:執(zhí)行
dos(windows系統(tǒng))
或
shell(Linux/Unix系統(tǒng))
命令,參數(shù)字符串command為命令名;
說明:在windows系統(tǒng)中,system函數(shù)直接在控制臺(tái)調(diào)用一個(gè)command命令。在Linux/Unix系統(tǒng)中,system函孫扮數(shù)會(huì)調(diào)用fork函數(shù)產(chǎn)生子進(jìn)程,由子進(jìn)程來執(zhí)行command命令,命令橘凱山執(zhí)行完后隨即返回原調(diào)用的進(jìn)程;
頭文件:stdlib.h;
返回值:命令執(zhí)行成功返回0,執(zhí)行失敗返回-1。
2、例程:
#include
#include
int main(){
system(“del C:\\123.txt”);//在控制臺(tái)中,執(zhí)行命令del C:\\123.txt,刪除C盤目錄下的123.txt文件
return 0;
}
如果是在LINUX下面用的話,寫一個(gè)交互友好一點(diǎn)的SHELL腳本是罩念代價(jià)最小的,要想用C語言實(shí)現(xiàn)代價(jià)實(shí)在太高,光ifconfig/route的源碼分析就很多了,還不說DHCP、DNS和用戶管理什么的了。
其實(shí)以上這些需求直接都孫好有物凱困現(xiàn)成的指令或系統(tǒng)調(diào)用,用Shell加工一下就OK了。
關(guān)于linux c dns的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專注成都高端網(wǎng)站建設(shè)定制開發(fā)服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開發(fā),營銷網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
分享名稱:用linux c實(shí)現(xiàn)高效dns解析 (linux c dns)
網(wǎng)站路徑:http://m.fisionsoft.com.cn/article/cojhigg.html


咨詢
建站咨詢
