使用C语言获取指定域名的IP

  最近正在学习使用C语言发送电子邮件,但是发送邮件需要连接到SMTP服务器,C语言只支持连接IP,而不支持连接域名,那么就需要将SMTP地址转换成IP地址了。虽然我们可以使用DOS命令中的ping命令来将SMTP服务器的IP地址转换出来,但这并不是我的本意。在网上找贴半天,实在是让人无语。最后,自己终于研究出来,故发表出来,希望能够帮助到大家。

  如果要将一个域名转换成一个IP地址,需要使用到Winsock中的函数gethostbyname。相反,如果我们想将一个IP地址转换成一个域名,则使用gethostbyaddr。今天,我们主要来详细讲解gethostbyname。

 

struct hostent FAR *PASCAL FAR gethostbyname(const char FAR * name);

其中,name指的是指向一个域名的指针,该函数返回的是一个hostent型的结构体。

 

结构体定义如下:

struct hostent  {  char FAR * h_name;  char FAR * FAR * h_aliases;  short h_addrtype;  short h_length;  char FAR * FAR * h_addr_list;  };

 

hostent->h_name 指的是主机的规范名,例如www.google.com.hk的规范名其实是www-wide.l.google.com
hostent->h_aliases 指的是主机的别名,例如www.google.com.hk就是google他自己的别名,有时候,有的主机有好几个别名,这些其实都是为了易于用户的记忆而为自己的网站多取的名字
hostent->h_addrtype 指的是主机IP地址的类型,可能是IPV4(AF_INET)或者是IPV6(AF_INET6)
hostent->h_length 指的是主机IP地址的长度,如果是IPV4,则是4
hostent->h_addr_list 表示主机的IP地址,需要使用inet_ntoa转换成字符串格式的IP地址。IP地址可能有1——更多个。

inet_ntoa函数将一个IP转换成一个互联网标准点分格式的字符串。

char FAR * inet_ntoa( struct in_addr in);

注意:如果使用inet_ntoa转换hostent->h_addr_list,需要强制转换成struct
in_addr *格式。

下面是源代码例程

char * smtpIp(char * url)  {      HOSTENT * iphost;      char ipconfig[20];        if((iphost = gethostbyname(url)) != NULL)      {          int i = 0;            while(iphost->h_addr_list[i])          {              char ip[20];              memcpy(&ip, inet_ntoa(*((struct in_addr *)iphost->h_addr_list[i])), 20);              printf("%s", ip);                memset(ip, '\0', 20);              i++;          }      }  }

注意:在调用任何Winsock函数之前,必须先调用WSAStartup函数

 

转载本文请注明来源:www.cnblogs.com/cnlyml


发表评论

电子邮件地址不会被公开。 必填项已用*标注