LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1159|回复: 4

关于DNS函数gethostbyname的问题

[复制链接]
发表于 2005-3-31 23:20:24 | 显示全部楼层 |阅读模式
[PHP]
int
GetHostipStr (char *hostdns, char *hostip)
{
  int i;
  unsigned char IP[4];
  struct hostent *host;
  if (!(host = gethostbyname (hostdns)))
    {
      printf ("gethostbyname:%s!\n", hostdns);
      return (S_ERROR);
    }
  for (i = 0; i < 4; i++)
    IP = (host->h_addr);
  sprintf (hostip, "%d.%d.%d.%d", IP[0], IP[1], IP[2], IP[3]);
  return (S_OK);
}
[/PHP]
我看UNP上说hostent的返回是个结构指针
struct hostent{
char * h_name;
char ** h_aliases;
int h_addrtype;
int h_lenght;
char ** h_addr_list;
}
#define h_addr h_addr_list[0]
我不明白为什么上面的代码中
IP = (host->h_addr);
  sprintf (hostip, "%d.%d.%d.%d", IP[0], IP[1], IP[2], IP[3]);
我感觉host->h_addr应该里面的内容赋予ip对吧。但是h_addr里的东西应该是个指针
这个指针指向的是in_addr{}这么个结构
sprintf (hostip, "%d.%d.%d.%d", IP[0], IP[1], IP[2], IP[3]);
IP[0]之类的是传递给函数的指针,“打印”指针指向的东西
然后我去查了in_add 结构
struct in_addr{
in_addr_t s_addr;
}
解释说in_addr_t ipv4地址,一般是uint32_t
到这里我就有点糊涂了sprintf (hostip, "%d.%d.%d.%d", IP[0], IP[1], IP[2], IP[3])这个到底把什么东西打进hostip里?
UNP中文版208页的结构,h_add_list是指向一个地址段,那么IP = (host->h_addr),是不是吧这个host->h_addr[0]所指的第一个单元的内容给ip[0]?然后把host->h_addr[1]单元的内容给ip[1],以次类推?
发表于 2005-4-1 08:43:28 | 显示全部楼层
char ** h_addr_list;
#define h_addr h_addr_list[0]

因此 h_addr 相当于 *(h_addr_list + 0),h_addr 是 char * 型。

则 h_addr 相当于 *(h_addr + i),所以 h_addr 是 char 型,与 IP 类型一致。

h_addr[0],h_addr[1],h_addr[2],h_addr[3] 分别是 IPv4 地址的从高到低四个字节,所以最后打印到字符串的内容是这个地址的“点—十进制”表示。


另:上面这个程序有点多此一举,其实 hostip 可以这样得到:
hostip = inet_ntoa(*(struct in_addr *)(host->h_addr));

需包含头文件:sys/socket.h, netinet/in.h, arpa/inet.h
回复 支持 反对

使用道具 举报

发表于 2005-4-1 09:07:59 | 显示全部楼层
把数据的类型搞清楚,就好理解了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-1 09:42:43 | 显示全部楼层
有点明白乐,谢谢~
回复 支持 反对

使用道具 举报

发表于 2005-4-1 18:51:08 | 显示全部楼层
doubleelec 解释的很好
支持
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表