Linux 拨号vps windows公众号手机端

c语言中怎么做域名解析

lewis 7年前 (2018-11-23) 阅读数 11 #VPS/云服务器
文章标签 c语言域名解析

使用c语言实现域名解析的方法

c语言代码如下:

#include

#include

#include

typedef enum {false = 0, true = !false}bool;

typedef struct _DNSHEAD{ //dns 头部

USHORT ID;

USHORT tag; // dns 标志(参数)

USHORT numQ; // 问题数

USHORT numA; // 答案数

USHORT numA1; // 权威答案数

USHORT numA2; // 附加答案数

}DnsHead;

typedef struct _DNSQUERY //dns 查询结构

{

// char name[64];

// //查询的域名,这是一个大小在0到63之间的字符串;

USHORT type;

//查询类型,大约有20个不同的类型

USHORT classes;

//查询类,通常是A类既查询IP地址。

}DnsQuery;

#pragma comment(lib,"ws2_32.lib")

// 初始化操作

bool initWSA();

//显示错误

void displayErrWSA(char *str);

//创建套接字

SOCKET CreateSocket(int type);

//UDP sendto

int MySendto(SOCKET sockTo, const char FAR * buf,int len,char *addr,USHORT port);

//TCP 连接

bool MyConnect(SOCKET s, char *addr,USHORT );

// UDP recvfrom

int MyRecvFrom(SOCKET s, char FAR * buf,int len,char *addr,USHORT port);

//设置DNS 头部

bool SetDNSHead(char *name,char *buf);

int main(int arg,char *are[])

{

int Result=0;

char buf[1024]={0};

char addr[16] = "192.168.1.1";// dns 服务器地址

char *name = 0; //要查询的域名

SOCKET sockTo;

int len;

DnsHead *DnsH;

char *getIP;

//int i;

if ( !initWSA() )//初始化

{

displayErrWSA("initWSA err!");

return 1;

}

//创建套接字

if ( (sockTo = CreateSocket(SOCK_DGRAM)) == 0)

{

displayErrWSA("CreatSocket err!");

return 1;

}

while (1)

{

if (arg {

char temp[1024]={0};

printf("\n请输入要查询的域名:");

scanf("%s",temp);

if (temp[0] == 'q' ||temp[0] == 'Q')

{

break;

}

name = temp;

}

else

{

arg = 1;

name = are[1];

}

//设置dns 头部

SetDNSHead(name,buf);

//发送出去的请求数据长度

len = sizeof(DnsHead)+sizeof(DnsQuery)+strlen(name)+2;

// for (int i =0;inumQ = htons(1);

DnsH->numA = 0;

DnsQ =(DnsQuery *) ( buf+ sizeof(DnsHead) );

NameLen = ChName(name,(char *)DnsQ);

//设置查询信息

DnsQ = (DnsQuery *)( (char *)DnsQ + NameLen );

DnsQ->classes = htons(1);

DnsQ->type = htons(1);

return true;

}

//显示错误信息

void displayErrWSA(char *str)

{

printf("\n%s,err = %d\n",str,WSAGetLastError());

getchar();

}

//域名转化

int ChName(char *fname,char *tname)

{

int j =0;

int i =strlen(fname)-1;

int k = i+1;

tname[i+2] = 0;

for (; i>=0;i--,k--)

{

if (fname[i] == '.')

{

tname[k] = j;

j=0;

}

else

{

tname[k] = fname[i];

j++;

}

}

tname[k] = j;

return strlen(tname)+1;

}

版权声明

本文仅代表作者观点,不代表米安网络立场。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门