首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

C 语言实施 whois 查询

2013-07-09 
C 语言执行 whois 查询http://www.binarytides.com/c-code-to-perform-ip-whois/http://www.oschina.net/c

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;}

热点排行