一、用数值表示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函数来释放这块内存。  

6. 网络信息API的更多相关文章

  1. 封装获取网络信息Linux—API类

    封装获取网络信息Linux—API类 封装好的库: #ifndef NETINFORMATION_H #define NETINFORMATION_H #include <netdb.h> ...

  2. 在C#中调用API获取网络信息和流量

    原文 在C#中调用API获取网络信息和流量 最近一项目中要求显示网络流量,而且必须使用C#. 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量. ...

  3. Linux下通过ioctl系统调用来获取和设置网络信息

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  4. 【Socket编程】Java中网络相关API的应用

    Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...

  5. windows主机网络信息获取程序设计

    掌握windows系统获取网络信息的各种API函数的功能与调用方法,掌握设计程序显示获取到相关网络信息的方法,掌握网络字节数据与主机字节数据之间的转换.掌握这些API函数调用的错误处理方法. 利用本地 ...

  6. UWP 应用获取各类系统、用户信息 (2) - 商店授权信息、零售演示模式信息、广告 ID、EAS 设备信息、硬件识别信息、移动网络信息

    应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Gith ...

  7. 微信小程序把玩(三十八)获取设备信息 API

    原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...

  8. js获得用户网络状况API

    js获得用户网络状况API 这是一个实验中的功能,目前还有许多浏览器不兼容此功能某些浏览器尚在开发中 1. 网络类型 effectiveType: 可以得到2g,3g,4g connectionInf ...

  9. BackTrack5-r3配置网络信息

    设置静态IP在BT终端输入:ifconfig -a                           按回车// 查看所有网卡在BT终端输入:vi /etc/network/interfaces   ...

随机推荐

  1. python 判断是否是润年及函数封装

    方法一, 从终端输入一个表示年份的整数,判断是否是闰年,是就打印xxx年是闰年,不是打印xxx年不是闰年 y = int(input('请输入一个年份:')) if (y % 4 == 0 and y ...

  2. vue中的slot(插槽)

    vue中的插槽----slot 什么是插槽? 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. ...

  3. CentOS6安装各种大数据软件 第九章:Hue大数据可视化工具安装和配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  4. python使用tablib库生成xls表格

    参考文档:http://python-tablib.org Tablib是一个MIT许可的格式不可知的表格数据集库.它允许您导入,导出和操作表格数据集.高级功能包括隔离,动态列,标签和过滤,以及无缝格 ...

  5. 使用xampp发现php的date()函数与本地相差7个小时

    具体方法: 1. 打开php.ini 2. 搜索timezone 3. 修改为PRC 4. 回车键 5. 修改为PRC 6. 完成 没想到这么一个小问题也是一个大坑,在网上找了半天基本都是说要修改这个 ...

  6. flask中请求勾子

    请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: *在请求开始时,建立数据库连接; *在请求开始时,根据需求进行权限校验; *在请求结束时,指定数据的交互格式; 为了让每 ...

  7. Delphi写的DLL,OCX中多线程一个同步问题

    Delphi写的DLL,OCX中如果使用了TThread.Synchronze(Proc),可能导致线程死锁,原因是无法唤醒EXE中主线程, Synchronze并不会进入EXE主线程消息队列. 下面 ...

  8. Delphi的FIFO实现

    FIFO主要用于多个不同线程或进程之间数据交换时做缓冲区用,尤其适合实时数据通讯应用中的数据缓冲,接收线程(进程)将数据写入FIFO,处理线程(进程)从FIFO取出数据 本单元中: TMemoryFI ...

  9. Composer管理thinkphp版本

    安装Composer 下载 Composer 安装前请务必确保已经正确安装了 PHP.打开命令行窗口并执行 php -v 查看是否正确输出版本号. 打开命令行并依次执行下列命令安装最新版本的 Comp ...

  10. x01.os.24: 来点代码

    <Orange'S 一个操作系统的实现>源代码 <Linux 0.11 内核完全注释>源代码 linux-0.12 源代码:  解决了 Not Owner 问题 闲来无事,在 ...