http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net
分类: LINUX
2011-09-22 19:00:05
gethostname和gethostbyaddr在主机名字和ip地址间进行转换;
getservbyname和getservbyport在服务名和端口号间进行转换。
9.2 域名系统严格来说,FQDN也称为绝对名字(absolute name),因此必须以一个点号结尾,但用户经常省略最后的点号。
DNS替代方法
不适用DNS也可得到名字和地址信息,最常用的替代方法为静态主机文件(一般为文件/etc/hosts)或网络信息系统NIS(network Information System)。不幸的是,管理员如何配置一个主机来使用不同的名字服务时依赖于不同的实现的。
9.3 gethostbyname函数struct hostent * gethostbyname(const char * hostname);
返回:非空指针---成功, 空指针---出错,同时设置h_errno
从BIND4.9.2开始,新的gethostbyname版本允许主机名参数是点分十进制数串,也就是,下列形式的调用是可行的:
hptr = gethostbyname(“202.62.226.33”);
但是,Rlogin客户仅接受主机名,给它调用gethostbyname,而不接受点分十进制数组串。
gethostbyname发生错误时,它不设置errno,而是将全局整数h_errno设置为下列常值:
1)HOST_NOT_FOUND
2)TRY_AGAIN
3)NO_RECOVERY
4)NO_DATA(N等同于NO_ADDRESS)
BIND的当前版本提供函数hstrerror,它将h_errno的值作为唯一的参数。
9.4 RES_USE_INET6解析器选项1)应用程序本身设置此选项,首先调用解析器的res_init函数,然后打开该选项:
#include
res_init();
_res.option |= RES_USE_INET6;
2)如果环境变量RES_OPTION含有串inet6,则此选项打开。
export RES_OPTION = inet6
1) 解析器配置文件(一般为/etc/resolv.conf)可以包含下行:
option inet6
9.5 gethostbyname2函数与IPv6支持 *返回主机名的函数int uname(struct utsname *name);
int gethostname (char *name, size_t namelen);
9.9 getservbyname和getservbyport函数如果在我们的代码中,通过服务器的名字不是通过服务器端口来认知它,而且如果从主机到端口号的映射包含在一个文件中(一般是/etc/services),则如果端口号改变,我们所需做的所有修改就是改动文件/etc/services中的一行,而不是重新编译应用程序。
struct servent * getservbyname( const char * servname, const char* protoname);
返回: 非空指针------成功,空指针------出错
该函数返回一个指向下面所示结构的指针:
struct servent {
char * s_name; /* official service name */
char ** s_aliases ; /* alias list */
int s_port; /* port number, network-byte order */
char * s_proto; /* protocol to use */
};
struct servent * getservbyport( int port, const char * protoname);
返回: 非空指针------成功,空指针------出错
注意:prot值必须为网络字节序。
9.10 其他网络有关信息首先,只有主机和网络信息是通过DNS提供的,服务和协议信息一般要从相应的文件中读。不同的实现可让管理员使用不同的方法来指定是使用DNS还是使用文件来得到主机和网络信息。
第二,如果DNS正用于主机和网络信息,则只有键值查询函数才可用。例如,不能使用gethostent期待顺序浏览DNS中的所有表项。如果调用gethostent,它只读主机文件而避开DNS。
如果网络信息可以通过DNS得到,但很少有人这么用。通常,管理员创建并维护文件/etc/networks,并使用它而不是使用DNS。如果有此文件,则指定-i选项的netstat程序使用它,以输出每个网络的名字。