linux环境编程中ruptime示例中的getaddrinfo

来源:互联网 发布:绣花软件 编辑:程序博客网 时间:2024/05/21 17:17

前几天在看linux环境编程中的套接字时,看到了ruptime的示例。于是乎自己将示例在本机演示了一翻。

刚开始怎么弄都不对,服务器端的getaddrinfo(host,"ruptime",&hint,&ailist)老是报错,提示没有提供该服务。

自己一分析也觉得纳闷,getaddrinfo是怎么将ruptime和端口对应起来的呢,我是不是在启动该服务器前要先在系统中为该服务注册相应的端口呢?

通过对getaddrinfo进一步的学习和网上查询,发现getaddrinfo其实是读取了host主机的网络配置信息,而这些信息在linux环境编程16.3.3地址查询一节的开始说的很明白,以下引用原文

“这些函数返回的网络配置信息可能存放在许多地方。它们可以保存在静态文件中(如/etc/hosts,/etc/services等),或者可以同命名服务器管理,例如DNS或者NIS。无论这些信息放在何处,这些函数同样能够访问它们。”

看来服务器端的getaddrinfo函数是访问的本机的/etc/hosts或/etc/services文件,把开/etc/services文件一看,里面的确注册了很多服务,格式如下:

nfs       2049/tcp               #Network File System

nfs       2049/udp              #Network File System

说明本机中nfs注册的端口是2049,提供TCP,UDP两种不同协议的服务。


于是乎我在/etc/services文件中追加了以下内容:

ruptime     4000/tcp          # ruptime 示例

再次运行服务器程序,一切正常。

int getaddrinfo(
 
    const char* host

 
    const char* service

 
    const struct addrinfo* hints,
 
    struct addrinfo** res
 
);


所以我理解的getaddrinfo是去host读取/etc/services(也可能是/etc/hosts)文件并找到service,得到它的端口号和支持的协议,经过hints过滤后放到res中。


参考链接:

http://www.linuxidc.com/Linux/2011-08/40104.htm

http://www.cppblog.com/sleepwom/archive/2010/07/02/119136.aspx

原创粉丝点击