C 语言执行 whois 查询代码

/* * @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; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值