Files/etc/services

出自SurfLib

跳转到: 导航, 搜索

该文件包含了一些比较流行的网络服务所使用的端口信息,内容来自iana

例一

ssh              22/tcp     # SSH Remote Login Protocol

表示ssh服务一般使用的是22端口。

getservbyname,getservbyport等libc函数通过读取这个文件来获取网络服务的端口信息。我们在写网络程序的时候,如果需要访问一些流行的网络服务,一般是通过getservbyname来获取端口信息,而不是以硬编码的形式直接给出端口。下面两段代码具有相同的效果,但是尽可能使用例二,这并非因为以后ssh或者其他的网络服务所使用的端口会改变,而是因为这样可以避免程序员记忆出错。一般来说,有意义的字符串总是比数字好记的。

还有一个很重要的,使用getserv系列函数的原因就是就是IP协议里的数字是以network byte order(big endian)来存储,很多的network api都是需要传递一个network byte order的端口号,而机器的存储一般是用little endian。使用getserv系列函数就避免了进行hton的转换。

例二

   struct servent *serv_info;
   serv_info=getservbyname("ssh","tcp");
   int port=ntohs(serv_info->s_port);
   

例三

   int port=22;

题外话:经常有文档说到,一些众所周知的数字,完全没必要用有意义的字符串代替,例如stdin。其实这个是见仁见智了,我一般情况下还是用stdin,而不是0。

个人工具
全站导航
广告