链接whois数据库查询信息简单实现
#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转换成其相应的ip地址功能和dns差不多
{
HOSTENT *host;//用来存放主机信息
SOCKADDR_IN addrSrv;//用来存放HOSTEN中的ip地址信息
if((host=gethostbyname(url))==NULL)//调用函数将URL相关主机的信息存放在host中
{
printf("域名解析错误n");
return 1;
}
else
{
strcpy(ip,inet_ntoa(*((struct in_addr *)host->h_addr)));//将host中的网络地址转换成.分十进制的ip地址
return 0;
}
}
int database_query(char *url,char *cmd, char **GetInfor)//对whois数据库的访问
{ //第一个参数是表示要查询的服务器的URL,第二个参数是要查询的命令,第三个是返回的查询的信息
char tempbuf[1500];//用来存放接受的临时数据
char message[100];//用来存放格式化的查询命令
int sum=0;//用来表示存放最后查询结果的大小
int temp=0;//用来表示存放中间查询结果的大小
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协议规定与whois数据库连接时必须是tcp连接并且开放的端口是43
//对socket进行初始化
if(connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR))<0)//与服务器进行连接
{
printf("连接错误!n");
return 1;
}
sprintf(message , "srn" , cmd);//对输入的命令进行格式化处理即加上一个换行符
if(send(sockClient,message,strlen(message),0)<0)//给服务器发送消息
{
printf("发送失败!");
return 1;
}
while((temp=recv(sockClient,tempbuf,sizeof(tempbuf),0)))//由于接受的数据比较大所以在循环中一次一次的接受
{
*GetInfor = (char *)realloc(*GetInfor , temp sum);//在原来的数据的基础上开辟空间存放新读入的数据
if(*GetInfor == NULL)
{
printf("申请内存失败!n");//异常处理
}
memcpy(*GetInfor sum , tempbuf , temp);//将新读入的数据存入对应的空间
sum = temp;
}
fflush(stdout);
*GetInfor = (char *)realloc(*GetInfor , sum 1);
*(*GetInfor sum) = '0';
closesocket(sockClient);//关闭套接字
return 0;
}
void getInfor(char *ipaddress)//查询给定ip的主机的信息
{
char *divide=NULL;//用来存放接收的数据被处理后的结果
char *part=NULL;//用来存放最终访问的whois数据库的URL信息
char *result = NULL;//用来存放与iana数据库交互的结果
char *lastresult=NULL;//用来存放最终的结果
int flag=1;
flag=database_query("whois.iana.org",ipadd