C 语言执行 whois 查询代码

来源:互联网 发布:阿芙 知乎 编辑:程序博客网 时间:2024/06/06 14:52
/* * @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>//closeint 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 ipby 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 linewch = strstr(pch , "whois.");if(wch != NULL){break;}//Next line pleasepch = 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 serverif(connect( sock , (const struct sockaddr*) &dest , sizeof(dest) ) < 0){perror("connect failed");}//Now send some data or messageprintf("\nQuerying for ... %s ..." , query);sprintf(message , "%s\r\n" , query);if( send(sock , message , strlen(message) , 0) < 0){perror("send failed");}//Now receive the responsewhile( (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 infoherror("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;}


原创粉丝点击