6. 网络信息API
一、用数值表示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的更多相关文章
- 封装获取网络信息Linux—API类
封装获取网络信息Linux—API类 封装好的库: #ifndef NETINFORMATION_H #define NETINFORMATION_H #include <netdb.h> ...
- 在C#中调用API获取网络信息和流量
原文 在C#中调用API获取网络信息和流量 最近一项目中要求显示网络流量,而且必须使用C#. 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量. ...
- Linux下通过ioctl系统调用来获取和设置网络信息
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- 【Socket编程】Java中网络相关API的应用
Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...
- windows主机网络信息获取程序设计
掌握windows系统获取网络信息的各种API函数的功能与调用方法,掌握设计程序显示获取到相关网络信息的方法,掌握网络字节数据与主机字节数据之间的转换.掌握这些API函数调用的错误处理方法. 利用本地 ...
- UWP 应用获取各类系统、用户信息 (2) - 商店授权信息、零售演示模式信息、广告 ID、EAS 设备信息、硬件识别信息、移动网络信息
应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Gith ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- js获得用户网络状况API
js获得用户网络状况API 这是一个实验中的功能,目前还有许多浏览器不兼容此功能某些浏览器尚在开发中 1. 网络类型 effectiveType: 可以得到2g,3g,4g connectionInf ...
- BackTrack5-r3配置网络信息
设置静态IP在BT终端输入:ifconfig -a 按回车// 查看所有网卡在BT终端输入:vi /etc/network/interfaces ...
随机推荐
- MySQL数据查询(重点)
1.查询所有列 * 为所有列 select * from table_name; 2.查询指定列 select id,age from table_name; 3.查询时添加常量列-------本 ...
- PHP-----PHP程序设计基础教程----第二章PHP基本语法
博文结构: 2.1 PHP语法风格 2.1.1 PHP标记 PHP有四种风格的标记,具体如表2-1所示: 表2-1 PHP开始和结束标记 标记类型 开始标记 结束标记 示例 说明 标准标记 <? ...
- 请给出如下格式的date命令 例:11-02-26.再给出实现按周输出 比如:周六输出为6,请分别给出命令。
请给出如下格式的date命令 例:19-01-18.再给出实现按周输出 比如:周六输出为6,请分别给出命令. 解答: 方法1: [root@zhaokang ~]# date2019年 01月 17日 ...
- Redis之配置文件redis.conf
解读下 redis.conf 配置文件中常用的配置项,为不显得过于臃长,已选择性删除原配置文件中部分注释. # Redis must be started with the file path as ...
- MySQL的主从复制+双主模式
MySQL的主从复制 部署环境: MySQL master 192.168.40.21 MySQL slave 192.168.40.22 思路: 当主MySQL上进行数据上的操作或者变化时,主My ...
- WOT干货大放送:大数据架构发展趋势及探索实践分享
WOT大数据处理技术分会场,PingCAP CTO黄东旭.易观智库CTO郭炜.Mob开发者服务平台技术副总监林荣波.宜信技术研发中心高级架构师王东及商助科技(99Click)顾问总监郑泉五位讲师, ...
- GCC编译器基础入门
导语 GCC(GNU Compiler Collection,GNU 编译器套件) 是由 GNU 开发的编程语言编译器,支持C.C++.Objective-C.Fortran.Java.Ada和Go语 ...
- python迭代器生成器
1.生成器和迭代器.含有yield的特殊函数为生成器.可以被for循环的称之为可以迭代的.而可以通过_next()_调用,并且可以不断返回值的称之为迭代器 2.yield简单的生成器 #迭代器简单的使 ...
- Oracle——系统数据字典常用命令(查看表所属空间层目录等)
发生背景: 项目前后台交互对接时候,经常存在对底层表蒙圈情况尤其是oracle数据库,所在层级不同会导致操作对象直接的改变,从而发生意向不到的事情:很多时候需要了解我们所操作对象所处的层级等相关信息, ...
- MFC中两个对话框之间数据传递
以下是在网上参考的一篇文章,网址:https://blog.csdn.net/foreverhuylee/article/details/21707197 这里有两种情况, 第一种情况是: (在一个基 ...