#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include <unistd.h>
#include<pthread.h>
#include<stdlib.h>
#include<string.h>
/*
init_network:初始化网络连接
*/
int init_network()
{
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(-1 == sockfd)
{
perror("sockfd fail!");
return -1;
}
return sockfd;
}
/*
aname:把域名解析存入数据包
@a:目标域名
@p:发送的数据包的地址
*/
int aname(char* a,unsigned char*p)
{
char *pos=a;
int len=0;
int n=0;
while(1)
{ //通过strstr来判断'.'的位置,计算数据长度
n=(strlen(pos)-(strstr(pos,".")?(strlen(strstr(pos,"."))):0));
*p++=n;
strncpy(p,pos,n);
p+=n;
len+=n+1;
if(!strstr(pos,"."))
{
*pos=(unsigned char)0;
len+=1;
break;
}
pos+=n+1;
}
return len;
}
/*
page_data:发送给dns的数据包
@tes:存储数据包内容的数组
@arg:目标域名
*/
int page_data(unsigned char * tes,char * arg)
{
unsigned char *p=tes;
*((unsigned short*)p)=htons(0x1234); //前面都是两字节两字节的存储
p=p+2;
*((unsigned short*)p)= htons(0x0100);
p=p+2;
*((unsigned short*)p)=htons(0x0001);
p=p+2;
*((unsigned short*)p)=0;
p=p+2;
*((unsigned short*)p)=0;
p=p+2;
*((unsigned short*)p)=0;
p=p+2;
char na[100];
strcpy(na,arg);
int len=aname(na,p);
p+=len;
*((unsigned short*)p)=htons(0x0001);
p=p+2;
*((unsigned short*)p)=htons(0x0001);
return len;
}
int main(int argc, char * argv[])
{
//网络初始化
int sockfd=init_network();
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(53);
addr.sin_addr.s_addr=inet_addr("114.114.114.114");
//解析域名
unsigned char tes[256];
unsigned char *p=tes;
unsigned char buf[256];
int len=page_data(tes,argv[1]);
//发送数据包
struct sockaddr_in data_addr;
int len1=sizeof(data_addr);
int x=sendto(sockfd,tes,len+16,0,(struct sockaddr *)&addr,sizeof(addr));
int re=recvfrom(sockfd,buf,256,0,(struct sockaddr *)&data_addr,&len1);
printf("%d.%d.%d.%d\n",buf[re-4],buf[re-3],buf[re-2],buf[re-1]);
//结束操作
close(sockfd);
}
通过DNS解析域名获得ip
最新推荐文章于 2024-07-09 01:18:58 发布