C 语言执行 whois 查询
http://www.binarytides.com/c-code-to-perform-ip-whois/http://www.oschina.net/code/snippet_12_9390???/*
?
* @brief
?
* Whois client program
?
*
?
* @details
?
* This program shall fetch whois data for a IPv4 address.
?
*
?
* @author Silver Moon ( m00n.silv3r@gmail.com )
?
* */
?#include<stdio.h> //scanf , printf
#include<string.h>??? //strtok
#include<stdlib.h>??? //realloc
#include<sys/socket.h>??? //socket
#include<netinet/in.h> //sockaddr_in
#include<arpa/inet.h> //getsockname
#include<netdb.h> //hostent
#include<unistd.h>??? //close
?int
main(
int
argc ,
char
*argv[])
{
????
char
ip[100] , *data = NULL;
????
?????
printf
(
"Enter ip address to whois : "
);
????
scanf
(
"%s"
, ip);
????
?????
get_whois(ip , &data);
????
printf
(
"\n\n"
);
????
puts
(data);
????
?????
free
(data);
????
return
0;
}
?/**
????
Get the whois content of an ip
????
by selecting the correct server
*/
void
get_whois(
char
*ip ,
char
**data)
{
????
char
*wch = NULL, *pch , *response = NULL;
????
?????
if
(whois_query(
"whois.iana.org"
, ip , &response))
????
{
????????
printf
(
"Whois query failed"
);
????
}
????
?????
pch =
strtok
(response ,
"\n"
);
????
?????
while
(pch != NULL)
????
{
????????
//Check if whois line
????????
wch =
strstr
(pch ,
"whois."
);
????????
if
(wch != NULL)
????????
{
????????????
break
;
????????
}
?????????
//Next line please
????????
pch =
strtok
(NULL ,
"\n"
);
????
}
????
?????
if
(wch != NULL)
????
{
????????
printf
(
"\nWhois server is : %s"
, wch);
????????
whois_query(wch , ip , data);
????
}
????
else
????
{
????????
*data =
malloc
(100);
????????
strcpy
(*data ,
"No whois data"
);
????
}
????
?????
return
;
}
?/*
?
* Perform a whois query to a server and record the response
?
* */
int
whois_query(
char
*server ,
char
*query ,
char
**response)
{
????
char
ip[32] , message[100] , buffer[1500];
????
int
sock , read_size , total_size = 0;
????
struct
sockaddr_in dest;
?????
?????
sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
?????
?????
//Prepare connection structures :)
????
memset
( &dest , 0 ,
sizeof
(dest) );
????
dest.sin_family = AF_INET;
?????
?????
printf
(
"\nResolving %s..."
, server);
????
if
(hostname_to_ip(server , ip))
????
{
????????
printf
(
"Failed"
);
????????
return
1;
????
}
????
printf
(
"%s"
, ip);???
????
dest.sin_addr.s_addr = inet_addr( ip );
????
dest.sin_port = htons( 43 );
?????
//Now connect to remote server
????
if
(connect( sock , (
const
struct
sockaddr*) &dest ,
sizeof
(dest) ) < 0)
????
{
????????
perror
(
"connect failed"
);
????
}
????
?????
//Now send some data or message
????
printf
(
"\nQuerying for ... %s ..."
, query);
????
sprintf
(message ,
"%s\r\n"
, query);
????
if
( send(sock , message ,
strlen
(message) , 0) < 0)
????
{
????????
perror
(
"send failed"
);
????
}
????
?????
//Now receive the response
????
while
( (read_size = recv(sock , buffer ,
sizeof
(buffer) , 0) ) )
????
{
????????
*response =
realloc
(*response , read_size + total_size);
????????
if
(*response == NULL)
????????
{
????????????
printf
(
"realloc failed"
);
????????
}
????????
memcpy
(*response + total_size , buffer , read_size);
????????
total_size += read_size;
????
}
????
printf
(
"Done"
);
????
fflush
(stdout);
????
?????
*response =
realloc
(*response , total_size + 1);
????
*(*response + total_size) =
'\0'
;
????
?????
close(sock);
????
return
0;
}
?/*
?
* @brief
?
* Get the ip address of a given hostname
?
*
?
* */
int
hostname_to_ip(
char
* hostname ,
char
* ip)
{
????
struct
hostent *he;
????
struct
in_addr **addr_list;
????
int
i;
????????
?????
if
( (he = gethostbyname( hostname ) ) == NULL)
????
{
????????
// get the host info
????????
herror(
"gethostbyname"
);
????????
return
1;
????
}
?????
addr_list = (
struct
in_addr **) he->h_addr_list;
????
?????
for
(i = 0; addr_list[i] != NULL; i++)
????
{
????????
//Return the first one;
????????
strcpy
(ip , inet_ntoa(*addr_list[i]) );
????????
return
0;
????
}
????
?????
return
0;
}