鏈接whois數(shù)據(jù)庫查詢信息簡單實現(xiàn)
#include #include #include #include#pragma comment(lib, "ws2_32")//socket編程要包括的一個lib文件int dns_
#include
#include
#include
#include
#pragma comment(lib, "ws2_32")//socket編程要包括的一個lib文件
int dns_resolve(char *url,char *ip)//將給定的URL轉(zhuǎn)換成其相應的ip地址功能和dns差不多
{
HOSTENT *host;//用來存放主機信息
SOCKADDR_IN addrSrv;//用來存放HOSTEN中的ip地址信息
if((host=gethostbyname(url))==NULL)//調(diào)用函數(shù)將URL相關(guān)主機的信息存放在host中
{
printf("域名解析錯誤n");
return 1;
}
else
{
strcpy(ip,inet_ntoa(*((struct in_addr *)host->h_addr)));//將host中的網(wǎng)絡(luò)地址轉(zhuǎn)換成.分十進制的ip地址
return 0;
}
}
int database_query(char *url,char *cmd, char **GetInfor)//對whois數(shù)據(jù)庫的訪問
{ //第一個參數(shù)是表示要查詢的服務(wù)器的URL,第二個參數(shù)是要查詢的命令,第三個是返回的查詢的信息
char tempbuf[1500];//用來存放接受的臨時數(shù)據(jù)
char message[100];//用來存放格式化的查詢命令
int sum=0;//用來表示存放最后查詢結(jié)果的大小
int temp=0;//用來表示存放中間查詢結(jié)果的大小
char ip[32];//用來存放解析的域名的ip地址
dns_resolve(url,ip);//域名解析為ip地址
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addrSrv;
memset( &addrSrv , 0 , sizeof(addrSrv) );
addrSrv.sin_addr.S_un.S_addr=inet_addr(ip);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(43);//whois協(xié)議規(guī)定與whois數(shù)據(jù)庫連接時必須是tcp連接并且開放的端口是43
//對socket進行初始化
if(connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR))<0)//與服務(wù)器進行連接
{
printf("連接錯誤!n");
return 1;
}
sprintf(message , "srn" , cmd);//對輸入的命令進行格式化處理即加上一個換行符
if(send(sockClient,message,strlen(message),0)<0)//給服務(wù)器發(fā)送消息
{
printf("發(fā)送失敗!");
return 1;
}
while((temp=recv(sockClient,tempbuf,sizeof(tempbuf),0)))//由于接受的數(shù)據(jù)比較大所以在循環(huán)中一次一次的接受
{
*GetInfor = (char *)realloc(*GetInfor , temp sum);//在原來的數(shù)據(jù)的基礎(chǔ)上開辟空間存放新讀入的數(shù)據(jù)
if(*GetInfor == NULL)
{
printf("申請內(nèi)存失敗!n");//異常處理
}
memcpy(*GetInfor sum , tempbuf , temp);//將新讀入的數(shù)據(jù)存入對應的空間
sum = temp;
}
fflush(stdout);
*GetInfor = (char *)realloc(*GetInfor , sum 1);
*(*GetInfor sum) = '0';
closesocket(sockClient);//關(guān)閉套接字
return 0;
}
void getInfor(char *ipaddress)//查詢給定ip的主機的信息
{
char *divide=NULL;//用來存放接收的數(shù)據(jù)被處理后的結(jié)果
char *part=NULL;//用來存放最終訪問的whois數(shù)據(jù)庫的URL信息
char *result = NULL;//用來存放與iana數(shù)據(jù)庫交互的結(jié)果
char *lastresult=NULL;//用來存放最終的結(jié)果
int flag=1;
flag=database_query("whois.iana.org",ipadd