只适用于IPV4的函数:
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);
struct hostent{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
}
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
struct servent *getservbyname(const char *servname,const char *protoname);
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
}
struct servent *getservbyport(int port,const char *protoname);
IPV4和IPV6通用函数:
#include <netdb.h>
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result);
void freeaddrinfo(struct addrinfo *ai);
int getnameinfo(const struct sockaddr *sockaddr,socklen_t addrlen,char *host,socklen_t hostlen,char *serv,socklen_t servlen,int flags);
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <poll.h>
#include <limits.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/select.h>
#include <time.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int main(int argc, char **argv){
if(argc < 3){
printf("usage: mydns -h hostname -s 21 -f 4/6 -S dgram/stream -p 0/4/6\n");
return 1;
}
char *hostname = NULL;
char *service = NULL;
struct addrinfo hints, *result;
for(int i = 0; i < argc; i++){
printf("argv%d:%s\n",i,argv[i]);
if(i >= 2 && ((i % 2) == 0)){
char *type = argv[i-1];
if(strcmp(type,"-h") == 0){
hostname = argv[i];
printf("hostname = %s\n",hostname);
}else if(strcmp(type,"-s") == 0){
service = argv[i];
printf("service = %s\n",service);
}else if(strcmp(type, "-f") == 0){
if(strcmp(argv[i], "4") == 0){
hints.ai_family = AF_INET;
puts("AF_INET");
}else{
hints.ai_family = AF_INET6;
puts("AF_INET6");
}
}else if(strcmp(type,"-S") == 0){
if(strcmp(argv[i],"dgram") == 0){
hints.ai_socktype = SOCK_DGRAM;
puts("SOCK_DGRAM");
}else{
hints.ai_socktype = SOCK_STREAM;
puts("SOCK_STREAM");
}
}else if(strcmp(type,"-p") == 0){
if(strcmp(argv[i],"0") == 0){
hints.ai_protocol = 0;
puts("protocol=0");
}else if(strcmp(argv[i], "4") == 0){
hints.ai_protocol = IPPROTO_IPV4;
puts("protocol=4");
}else{
hints.ai_protocol = IPPROTO_IPV6;
puts("protocol=6");
}
}else{
printf("param %s is invalid\n",type);
}
}
}
int n = getaddrinfo(hostname,service,&hints,&result);
if(n != 0){
printf("getaddrinfo error:%s\n",gai_strerror(n));
return 1;
}
struct addrinfo *ressave = result;
n = 0;
do{
char addr[140];
char serv[30];
addr[0] = 0;
serv[0] = 0;
int rtn = getnameinfo(result->ai_addr,result->ai_addrlen,addr,140,serv,30,NI_NUMERICSERV);
if(rtn != 0){
printf("getnameinfo error:%s\n",gai_strerror(rtn));
}
printf("###### address %d info ########\n",n);
printf("cannoname:%s\n",result->ai_canonname);
printf("addr:%s:%s\n",addr,serv);
result = result->ai_next;
n++;
}while(result != NULL);
freeaddrinfo(ressave);
return 0;
}