日期:2014-05-16  浏览次数:20767 次

linux网络编程中gethostbyname、gethostbyaddr函数的用法
最近在学习linux网络编程,阅读别人代码时遇到下面一个问题。
在TCP套接口编程中,客户端向服务器是通过hostname参数进行信息传递的。所以在源代码tcp_client.c中对输入的命令
./tcp_client hostname是这样判断的:
C/C++ code

         if((host=gethostbyname(argv[1]))==NULL) 
    { 
        fprintf(stderr,"Gethostname error\n"); 
        exit(1); 
    } 


这里用到了gethostbyname这个函数。gethostbyname的参数为域名或者主机名。我使用命令hostname查的我的hostname为localhost.localdomain 。然后执行命令./tcp_client localhost.localdomain ,服务器端显示的结果是:Server get connection from 127.0.0.1 (但是我的IP值为192.168.1.100)。更不可思议的是,我可以使用命令./tcp_client 192.168.1.100 ,服务器的结果为:Server get connection from 192.168.1.100 。这就让我很不理解了,192.168.1.100是IP地址,它需要用gethostbyaddr()这个函数的啊。为什么这里执行命令./tcp_client 192.168.1.100会通过呢?? 


------解决方案--------------------
...

gethostbyname接受IP/域名,首先查看本地/etc/hosts,如果存在直接获得,否则发起DNS查询获得IP。

你提供localhost,在/etc/hosts里就得到了是本地环回127.0.0.1。
你提供了一个IP地址192.168。1.100,gethostbyname只检查IP合法性,之后就直接返回它了,你连接这个IP就是连接自己。