CNAME

http://en.wikipedia.org/wiki/CNAME_record


查询cname也很简单:

nslookup -q=cname mail.spottedfig.org

以下是一个使用C++编写的查询DNS CNAME记录的例程: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <netdb.h> using namespace std; int main(int argc, char *argv[]) { if (argc != 2) { cerr << "Usage: " << argv[0] << " <hostname>" << endl; return 1; } char *hostname = argv[1]; struct hostent *he; struct in_addr **addr_list; if ((he = gethostbyname(hostname)) == NULL) { cerr << "Failed to resolve hostname" << endl; return 1; } cout << "Hostname: " << hostname << endl; cout << "Aliases: "; char **aliases = he->h_aliases; while (*aliases) { cout << *aliases << " "; aliases++; } cout << endl; cout << "Addresses: "; addr_list = (struct in_addr **) he->h_addr_list; for (int i = 0; addr_list[i] != NULL; i++) { cout << inet_ntoa(*addr_list[i]) << " "; } cout << endl; if (he->h_addrtype == AF_INET && he->h_length == 4) { char cname[1024]; struct sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(53); sa.sin_addr = *((struct in_addr *) he->h_addr_list[0]); int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock < 0) { cerr << "Failed to create socket" << endl; return 1; } const char *query = "www"; int query_len = strlen(query); char buf[1024]; memset(buf, 0, sizeof(buf)); // 构造DNS查询报文 buf[1] = 0; buf[3] = 1; buf[5] = 1; char *p = buf + 6; memcpy(p, query, query_len); p += query_len + 1; *p++ = 0; *p++ = 1; // 发送DNS查询报文 int sa_len = sizeof(sa); int n = sendto(sock, buf, p - buf, 0, (struct sockaddr *) &sa, sa_len); if (n < 0) { cerr << "Failed to send DNS query" << endl; return 1; } // 接收DNS响应报文 n = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *) &sa, (socklen_t *) &sa_len); if (n < 0) { cerr << "Failed to receive DNS response" << endl; return 1; } // 解析DNS响应报文 uint16_t *p16 = (uint16_t *) buf; int id = ntohs(*p16++); uint16_t flags = ntohs(*p16++); uint16_t qcount = ntohs(*p16++); uint16_t acount = ntohs(*p16++); uint16_t nscount = ntohs(*p16++); uint16_t arcount = ntohs(*p16++); for (int i = 0; i < qcount; i++) { char *qname = (char *) p16; p16 += (strlen(qname) + 5) / 2; } for (int i = 0; i < acount; i++) { char *aname = (char *) p16; p16 += (strlen(aname) + 5) / 2; uint16_t atype = ntohs(*p16++); uint16_t aclass = ntohs(*p16++); uint32_t attl = ntohl(*(uint32_t *) p16); p16 += 2; uint16_t alen = ntohs(*p16++); if (atype == 5) { // CNAME memcpy(cname, p16, alen); cname[alen] = '\0'; } p16 += alen / 2; } close(sock); cout << "CNAME: " << cname << endl; } return 0; } ``` 该例程使用了gethostbyname函数获取主机名的IP地址列表,并使用UDP套接字发送DNS查询报文和接收DNS响应报文。查询CNAME记录的过程是在解析DNS响应报文中找到类型为5的资源记录,并解析其数据部分得到CNAME的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值