#完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <time.h>
#define DNS_SERVER_PORT 53
#define DNS_SERVER_IP “114.114.114.114”
#define DNS_HOST 0x01
#define DNS_CNAME 0x05
struct DNS_HEADER
{
unsigned short id;//会话id
unsigned char qr :1;
unsigned char opcode :4;
unsigned char aa :1;
unsigned char tc :1;
unsigned char rd :1;
unsigned char ra :1;//1
unsigned char cd :1;
unsigned char ad :1;
unsigned char z :1;
unsigned char rcode :4;
unsigned short q_count;
unsigned short ans_count;
unsigned short auth_count;
unsigned short add_count;
};
struct DNS_QUESTION
{
unsigned char* qname;
unsigned short qtype;
unsigned short qclass;
};
/*
从www.baidu.com转换到3www5baidu3com
/
void ChangetoDnsNameFormat(unsigned char dns, unsigned char host) {
int lock = 0, i;
strcat((char) host, “.”);
for (i = 0; i < strlen((char*) host); i++) {
if (host[i] == '.') {
*dns++ = i - lock;
for (; lock < i; lock++) {
*dns++ = host[lock];
}
lock++;
}
}
*dns++ = '\0';
}
//dns响应报文中数据(域名和ip)的结构体
struct dns_item{
char *domain;
char *ip;
};
int dns_create_header_(struct DNS_HEADER* header)
{
if(header == NULL)
return -1;
memset(header, 0x00, sizeof(struct DNS_HEADER));
srandom(time(NULL)); //
unsigned short a = random();
header->id = htons(a);
printf(“dns id :%d\n”, a);