免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1777 | 回复: 4
打印 上一主题 下一主题

[C] 有段代码实在是看不懂?请大家指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-15 20:41 |只看该作者 |倒序浏览
10可用积分
我看一个linux下载的一个源代码时,有一段代码不是很清楚一下就是:

  1.     struct sockaddr_in pin;
  2.     struct hostent *nlp_host;

  3.     if((nlp_host = gethostbyname(host))==0)
  4.                 sdd_ErrReturn("Errorresolving local host\n",0);
  5.     bzero(&pin,sizeof(pin));
  6.     pin.sin_family = AF_INET;
  7.     pin.sin_addr.s_addr = ((struct in_addr*)(nlp_host->h_addr))->s_addr;
  8.     pin.sin_port = htons(iport);
  9.     pin.sin_addr.s_addr = ((struct in_addr*)(nlp_host->h_addr))->s_addr;
  10.     // 请这句代码的最后面?nlp_host->h_addr这个不是已经得出地址了么?为什么还要加个->s_addr
  11.   
复制代码

pin.sin_addr.s_addr = ((struct in_addr*)(nlp_host->h_addr))->s_addr;
    // 请这句代码的最后面?nlp_host->h_addr这个不是已经得出地址了么?为什么还要加个->s_addr
改成这样是inet_ntoa(*((struct in_addr *)h->h_addr))?行么?.下边是关于hostent的函数说明
struct hostent {
   char *h_name;
   char **h_aliases;
   int h_addrtype;
   int h_length;
   char **h_addr_list;
   };
   #define h_addr h_addr_list[0]  
这里是这个数据结构的详细资料:  
struct hostent:  
  h_name – 地址的正式名称。
  h_aliases – 空字节-地址的预备名称的指针。
  h_addrtype –地址类型; 通常是AF_INET。  
  h_length – 地址的比特长度。
  h_addr_list – 零字节-主机网络地址指针。网络字节顺序。
  h_addr - h_addr_list中的第一地址。
gethostbyname () 成功时返回一个指向结构体 hostent 的指针,或者 是个空 (NULL) 指针。(但是和以前不同,不设置errno,h_errno 设置错 误信息。请看下面的 herror()。) 但是如何使用呢? 这个函数可不象它看上去那么难用。
这里是个例子:
#include  
  #include  
  #include  
  #include  
  #include  
  #include  
int main(int argc, char *argv[])
   {
   struct hostent *h;
if (argc != 2) { /* 检查命令行 */
   fprintf(stderr,"usage: getip address ");
   exit(1);
   }
if ((h=gethostbyname(argv[1])) == NULL) { /* 取得地址信息 */
   herror("gethostbyname");
   exit(1);
   }
printf("Host name : %s ", h->h_name);
  printf("IP Address : %s ",inet_ntoa(*((struct in_addr *)h->h_addr)));
return 0;
   }
在使用 gethostbyname() 的时候,你不能用perror() 打印错误信息 (因为 errno 没有使用),你应该调用 herror()。
相当简单,你只是传递一个保存机器名的字符串(例如 "whitehouse.gov") 给gethostbyname(),然后从返回的数据结构  struct hostent 中获取信息。唯一也许让人不解的是输出 IP 地址信息。h->h_addr 是一个 char *, 但是 inet_ntoa() 需要的是  struct in_addr。因此,我转换 h->h_addr 成 struct in_addr *,然后得到数据。

最佳答案

查看完整内容

nlp_host->h_addr 的地址指向一个 struct in_addr,所以 (struct in_addr *) 转化一下,而 struct in_addr 是这样的,所以有个 ->s_addr[ 本帖最后由 win_hate 于 2008-11-15 21:02 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-15 20:41 |只看该作者
pin.sin_addr.s_addr = ((struct in_addr*)(nlp_host->h_addr))->s_addr;
    // 请这句代码的最后面?nlp_host->h_addr这个不是已经得出地址了么?为什么还要加个->s_addr


nlp_host->h_addr 的地址指向一个 struct in_addr,所以 (struct in_addr *) 转化一下,而

struct in_addr 是这样的,所以有个 ->s_addr

  1. struct in_addr {
  2.     unsigned long s_addr;          // load with inet_pton()
  3. };
复制代码

[ 本帖最后由 win_hate 于 2008-11-15 21:02 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-11-15 21:16 |只看该作者
这里是一个简短的例子:


  1. #include<stdio.h>
  2. #include <netdb.h>
  3. #include <arpa/inet.h>

  4. int
  5. main ()
  6. {
  7.         struct hostent *p;
  8.         struct in_addr addr;

  9.         p=gethostbyname("VIKI");
  10.         addr=((struct in_addr*)(p->h_addr))[0];
  11.         printf ("%x\n", addr.s_addr);

  12. }
复制代码


  1. zxl@VIKI:~/test/cu$ ./a.out
  2. 101007f
复制代码


输出的地址 101007f 就是 ip 地址 127.0.0.1

论坛徽章:
0
4 [报告]
发表于 2008-11-15 21:21 |只看该作者
好的,谢谢版主,我研究下,呵呵

论坛徽章:
0
5 [报告]
发表于 2008-11-15 23:29 |只看该作者
:wink: 很不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP