使用C语言获取指定域名的IP
2014-09-12 20:28
288 查看
最近正在学习使用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——更多个。 |
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函数
相关文章推荐
- 使用C语言获取指定域名的IP
- 使用C语言获取指定域名的IP
- 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容
- c#中HttpWebRequest使用Proxy实现指定IP的域名请求
- c#中HttpWebRequest使用Proxy实现指定IP的域名请求
- 使用Socket成功谅解服务器以后获取服务器的IP和域名
- AU3学习案例之---获取指定域名IP
- C语言使用socket通过IP138获取外网IP
- 系统无ifconfig,一条命令获取本机ip并将其赋值给指定变量来使用
- VBS 从指定 DNS 获取给定域名(Domain)的 IP 地址
- 同一域名对应多个IP时,获取指定IP服务器的远程网页内容
- 多个网站域名使用同一个IP的设置
- 通过域名获取IP[转帖]
- VS6.0下使用 IP Help API(Iphlpapi.dll)系列函数之GetAdaptersAddresses(GetAdaptersInfo) 获取网卡信息简述
- C语言实现的PadLeft,在str的左边使用bychar补齐为指定的长度
- C#如何使用GetTcpTable API获取TCP/IP连接信息
- 使用DateDiff方法来获取系统时间与指定时间的间隔数
- 使用C语言获取文件夹地址的方法
- 使用Windows Socket API获取局域网的电脑IP和名字