本文摘自:http://blog.163.com/lyzaily@126/blog/static/4243883720091025102830596/
gethostbyname()使用该函数可以将一个服务器的域名转化成该服务器的IP地址;要注意的是一台服务器的域名可以对应多个不同的IP,也就是说你通过google域名来访问google服务器时,你在不同的时刻访问可能登陆的是google的不同计算机。为什么不直接用IP地址而用域名?这个问题我已经在我的另外一篇博文《如何将域名地址转换成对应的IP地址?》 说明过。
在解释该函数执行不成功的一个原因之前,我们有必要了解一下该函数的参数和返回值。
函数原型:
struct hostent FAR* gethostbyname( const char FAR* name );
name:是一个指针,该指针指向的是要被解析的主机名字符串,以NULL结尾。
返回值:是一个指针,指向一个struct hostent类型的指针。
在使用该函数要注意的是:
(1) name指针指向的字符串,必须是主机名字符串;举个例子:比如我们要登录 google主页,这要在浏览器里输入http://www.google.com/, 所谓的主机名字符串指的是去掉“http://”头剩下的部分“www.google.com”,如果使用“http://www.google.com/”该函数执行就不会得到真确的结果。
(2)我们要了解一下结构体 struct hostent
struct hostent {
char FAR* h_name;
char FAR* FAR* h_aliases;
short h_addrtype;
short h_length;
char FAR* FAR* h_addr_list;
};
该结构体成员的详细解释请参阅MSDN,我这里要提醒一下的是 h_addr_list 成员 ,该成员是一个指向指针的指针类型变量,也就是一个指向指针数组的指针,在数组的每一个成员都指向一个点分的IP地址字符串,这些IP都与我们要转换的域名对应,那么与该域名对应的IP有多少呢?该指针数组时以NULL结尾的,我们可以通过这一标志遍历这个指针数组得到所有的与该域名对应的IP地址字符串。
下面给出一端代码来说明如何使用该函数获得IP地址,该代码是别人写的,我只是稍微修改了一下用于测试以说明我上面给出的结论,该程序我已经在VS2005上测试通过,读者可以自己试验一下,同时要注意代码红色标志处是如何遍历出IP的:
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define name "www.baidu.com"
void main()
{
WSADATA wsadata;
int n;
char hostname[256];
hostent *phostent;
protoent *pprotoent;
struct sockaddr_in sa;
if(WSAStartup(MAKEWORD(1,1),&wsadata)!=0)
{
printf("wsastartup() failed!!\n");
return;
}
//printf("--------------------------\n");
//if(gethostname(hostname,sizeof(hostname))!=0)
//{
// printf("gethostbyname() error!!\n");
// return;
//}
memset(hostname,0,sizeof(hostname));
sprintf(hostname,"%s",name);
printf("local host name:%s\n",hostname);
printf("------------------\n");
phostent=gethostbyname(hostname);
if(phostent==NULL)
{
printf("gethostbyname() error!!\n");
return;
}
printf("name:%s\nalianses:%s\naddrtype:%d\nlength:%d\n",phostent->h_name,phostent->h_aliases,phostent->h_addrtype,phostent->h_length);
for(n=0;phostent->h_addr_list[n];n++)
{
memcpy(&sa.sin_addr.s_addr,phostent->h_addr_list[n],phostent->h_length);
printf("address:%s\n",inet_ntoa(sa.sin_addr));
}
printf("--------------------\n");
pprotoent=getprotobyname("tcp");
if(pprotoent==NULL)
{
printf("getprotobyname() failed!!\n");
return;
}
printf("name:%\nproto:%d\n",pprotoent->p_name,pprotoent->p_proto);
for(n=0;pprotoent->p_aliases[n];n++)
{
printf("aliases:%s\n",pprotoent->p_aliases[n]);
}
WSACleanup();
}
【知识补充】
在我们认识HTTP之前,有必要先弄清楚URL的组成,例如:
http://www.microsoft.com/china/index.htm。它的含义如下:
1.http://:代表超文本传输协议,通知microsoft.com服务器显示Web页,通常不用输入;
2.www:代表一个Web(万维网)服务器;
3.Microsoft.com/:这是装有网页的服务器的域名,或站点服务器的名称;
4.China/:为该服务器上的子目录,就好像我们的文件夹;
5.Index.htm:index.htm是文件夹中的一个HTML文件(网页)。