一、用数值表示socket地址&用名字表示socket地址(socket地址==>IP地址和端口号)

1. 用数值表示socket地址不便于记忆,也不便于扩展(比如从IPv4转移到IPv6)

2. 用名字表示socket地址意味着用主机名代替IP地址,用服务名称代替端口号

我们可以用主机名来访问一台机器,而避免直接使用其IP地址。同样,我们用服务名称来代替端口号。

所以,下面两条telnet命令具有完全相同的作用:

telnet  127.0.0.1

telnet  localhost  www

二、实现主机名<=====>IP地址和服务名称<=====>端口号的系统调用

1. gethostbyname

/* 根据主机名获取主机的完整信息 */
struct hostent* gethostbyname(const char *name); /* 参数说明 */
// name:目标主机的主机名   

2. gethostbyaddr

/* 根据IP地址获取主机的完整信息 */
struct hostent* gethostbyaddr(const void *addr, size_t len, int type); /* 参数说明 */
// addr:目标主机的IP地址
// len:addr所指IP地址的长度
// type:addr所指IP地址的类型,如AF_INET、AF_INET6

3. getservbyname

/* 根据服务名称获取某个服务的完整信息 */
struct servent* getservbyname(const char *name, const char *proto); /* 参数说明 */
// name:目标服务的名字
// proto:指定服务类型,给它传递“tcp”表示获取流服务,“udp”表示数据报服务,NULL表示所有类型的服务

4. getservbyport

/* 根据端口号获取某个服务的完整信息 */
struct servent* getservbyport(int port, const char *proto); /* 参数说明 */
// port:目标服务对应的端口号
// proto:指定服务类型,给它传递“tcp”表示获取流服务,“udp”表示数据报服务,NULL表示所有类型的服务

5. getaddrinfo

/* 既能通过主机名获得IP地址,也能通过服务名获得端口号 */
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result); /* 参数说明 */
// hostname:可以接收主机名,也可以接收字符串表示的IP地址
// service:可以接收服务名称,也可以就收字符串表示的十进制端口号
// hints:应用程序给getaddrinfo的一个提示,以对getaddrinfo的输出进行更精确的控制
// result:指向一个链表,该链表用于存储getaddrinfo反馈的结果

  

6. getnameinfo

/* 能通过socket地址同时获得以字符串表示的主机名和服务名 */
int getnameinfo(const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags); /* 参数说明 */
// host:返回的主机名
// serv:返回的服务名
// flags:控制getnameinfo的行为

  

三、余音绕梁

1. getservbyname和getservbyport都是通过读取/etc/services文件来获取服务的信息的

  

从服务名称到端口号的映射关系保存在/etc/services文件中,故当端口号变动时,我们只需修改该文件中的某一行,而不必重新编译应用程序。这也是为什么希望在程序中通过服务名称而不是端口号来指代一个服务的原因之一。另一个原因是因为名字容易记住,而端口号作为数值并不容易记住。

2. 虽然大部分因特网服务仅仅支持单个协议,如FTP要求只使用TCP,但是有些因特网服务同时支持TCP协议及UDP协议,而且支持多个协议的服务往往使用相同的TCP端口号和UDP端口号。

补:极少数端口号在TCP上用于甲服务,在UDP上却用于乙服务。

3. 由getaddrinfo的result参数返回的addrinfo结构链表是动态分配而来的,所以我们必须使用freeaddrinfo函数来释放这块内存。  

最新文章

  1. html 页面内锚点定位及跳转方法总结
  2. jsQunit
  3. Twitter Storm安装配置(Ubuntu系统)单机版
  4. 【POJ 1228】Grandpa&#39;s Estate 凸包
  5. WPF MenuItem 四种角色分析
  6. WPF实现窗口最小化到托盘,并且实现右击菜单
  7. Apache Spark源码走读之5 -- DStream处理的容错性分析
  8. 送给刚刚開始学cocos2d-x引擎 移植Android的同学
  9. nodejs添加路由route步骤详解
  10. U菜1G变化8M该解决方案
  11. 怎么理解js的面向对象编程
  12. jQuery源码逐行分析学习02(第一部分:jQuery的一些变量和函数)
  13. java代码之美(4)---guava之Immutable(不可变)集合
  14. mysql - Truncated incorrect DOUBLE value: &#39;undefined&#39;
  15. node基础—http模块
  16. Python的列表和元组
  17. 精通CSS 第1章
  18. APP注册邀请码
  19. TextBlock 重写,当文本过长时,自动截断文本并出现Tooltip
  20. 信息安全系统设计基础_exp1

热门文章

  1. 【ZOJ 2996】(1+x)^n(二项式定理)
  2. 19-3-14Python中函数的进阶
  3. Linux之CentOS7.5安装及克隆
  4. 浅淡 RxJS WebSocket
  5. Hbase(1)-MySQL海量数据存储的启发
  6. 发现环——第八届蓝桥杯C语言B组(国赛)第四题
  7. (译)我为什么用Go语言来做区块链——Syed Jafar Naqvi——Co-Founder/CEO at Karachain
  8. scala (6) Map
  9. 20155217 2016-2017-2《Java程序设计》课程总结
  10. POI导出excel文件样式