inet_aton和inet_network和inet_addr三者比较-《别怕Linux编程》之五
http://roclinux.cn/?p=1160
知识背景:
210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式。英语叫做IPv4 numbers-and-dots notation。
如果把210.25.132.181转换为整数形式,是3524887733,这个就是整数形式的IP地址。英语叫做binary data。(其实binary是二进制的意思)
问题所在:
如何在字符串形式的IP和整数形式的IP之间转换呢?
问题解决思路:
有三个函数可以解决这个问题,当然不止这三个函数,只是这三个函数最常用且最易混淆。
隆重推出他们:inet_network(), inet_addr(), inet_aton()!!
三者定义:
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
三者区别:
先说出区别吧,不卖关子。但其实这样不好,因为我怕你因为知道了结论而不去动手实践了。(你不会的,是吧? ^_^)
纸上得来终觉浅,绝知此事要躬行。
inet_addr和inet_network函数都是用于将字符串形式转换为整数形式用的,两者区别很小,inet_addr返回的整数形式是网络字节序,而inet_network返回的整数形式是主机字节序。(你一定会纳闷,为什么函数叫inet_network,却返回的是主机字节序,呵呵,就是这么奇怪,你又有什么办法呢…)其他地方两者并无二异。他俩都有一个小缺陷,那就是当IP是255.255.255.255时,这两个“小子”(对这两个函数的昵称,请谅解…^_^)会认为这是个无效的IP地址,这是历史遗留问题,其实在目前大部分的路由器上,这个255.255.255.255的IP都是有效的。
inet_aton函数和上面这俩小子的区别就是在于他认为255.255.255.255是有效的,他不会冤枉这个看似特殊的IP地址。所以我们建议你多多支持这个函数,那两个小子还是少用为好:)对了,inet_aton函数返回的是网络字节序的IP地址。
好了,区别就这么简单,只要你能潜下心来看五分钟,就OK了。哦,忘了,什么叫网络字节序,什么叫主机字节序?这两个概念,如果你不太了解,你最好去找一本socket编程的书籍看一看,我保证没有5分钟,你就会了解这两个概念。
编程举例:
#include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<netinet/in.h> #include<sys/socket.h> #include<sys/types.h>int main() {char str[]="255.255.255.255";in_addr_t r1,r2,r3;struct in_addr inp;r1=inet_addr(str);if(r1==-1){printf("inet_addr return -1 when 255.255.255.255\n");}else{printf("inet_addr:ip=%lu\n",ntohl(r1));}r2=inet_network(str);if(r2==-1){printf("inet_network return -1 when 255.255.255.255\n");}else{printf("inet_network:ip=%lu\n",r2);}r3=inet_aton(str,&inp);if(r3==0){printf("inet_aton return -1 when 255.255.255.255\n");}else{printf("inet_aton:ip=%lu\n",ntohl(inp.s_addr));}return 0; } |
你肯定会理解的,只要把str的值稍微修改修改,你就可以得到不同的结果,从而看出其中玄机~~:)
over~
inet_aton和inet_network和inet_addr三者比较-《别怕Linux编程》之五相关推荐
- bus,device,driver三者关系
bus,device,driver三者关系 bus: 总线作为主机和外设的连接通道,有些总线是比较规范的,形成了很多协议.如 PCI,USB,1394,IIC等.任何设备都可以选择合适的总线连接到主机 ...
- Socket编程 - 网络基础知识
API编程部分:http://www.cnblogs.com/Jimmy1988/p/7895213.html 1. 协议简介 此处,我们主要介绍Linux编程常用的三种协议(TCP/UDP/IP), ...
- Linux Socket详解 大全 基础知识
1. Socket基础概念: 1.1:形象类比: Socket和电话网络的概念可以做一个很好的类比: Linux 编程中所说的socket就如同一个端点,类比到电话网中,它就如同一个电话机. 而Soc ...
- 网络编程 网络地址点分十进制和二进制之间的转换
网络编程 网络地址点分十进制和二进制之间的转换 点分十进制->二进制 点分十进制转二进制的函数有inet_addr,inet_aton,inet_network,inet_pton,它们都将输入 ...
- IP地址和二进制IP地址之间的转换
我们看到的IP通常是类似于127.0.0.1这样的字符串,然而计算机理解的则是像0x01111111100000000000000000000001(127.0.0.1)这样的ip地址方式. 对于Li ...
- Beej网络编程指南《三》
9手册 在Unix世界里,有很多手册.它们有小部分描述了你可以使用的单个函数. 当然,手动的东西太难打了.我的意思是,在Unix世界里,没有人,包括我自己,喜欢打那么多.事实上,我可以长篇大论地说我有 ...
- Socket编程:必须要了解的网络字节序和转换函数
目录 主机字节序和网络字节序 转换函数 htonl .htons .ntohl 和 ntohs inet_addr .inet_aton 和 inet_ntoa inet_pton 和 inet_nt ...
- Epoll例子的使用
第一部分:Epoll简介 问题 : Select,Poll和Epoll的区别 答案 : Epoll和Select的区别 1. 遍历方式的区别 .select判断是否有事件发生是遍历的,而epoll ...
- socket地址API
主机字节序和网络字节序 现代CPU的累加器一次都能装载 (至少) 4字节(这里考虑32位机,下同),即-一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数的值.这就是字节序问题.字节 ...
最新文章
- web中的cookies以及作用--web testing 学习笔记
- android 启动app过程,Android P APP冷启动过程全解析(之四)
- Android推送进阶课程学习笔记
- 博士申请 | 北京大学信息科学技术学院段凌宇教授招收2022级博士生
- Surprise官方文档练习
- Mar9th 海尔java面试
- 抹机王怎么一键新机_抹机王助手_手机数据修改_抹机王app下载_易玩网
- 【国信安实训】——文件上传漏洞
- winscp 进入mysql命令_Winscp使用密钥登录
- 微信小程序中进行地图导航
- 设置锁屏方式后,锁屏长按电源键还有锁屏按钮(lockdown)锁屏状态下应该没有,解锁使用后长按才有这个按钮。
- 联想计算机怎么关机,联想笔记本怎么关机
- 法原子能机构将福岛核电站爆炸事故提升至6级
- 比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!
- Java 实现位运算计算加减乘除
- [ MessAuto ]: 短信验证码自动填充,理论支持所有浏览器或 APP, Only For Mac
- 职场回头草,可吃得?
- Canvas绘制八卦图
- 穷查理宝典-----第二章 (芒格的生活、学习决策方法)
- 小肚皮最新版本_小肚皮下载_小肚皮APP手机最新版安装 - 风云下载
热门文章
- Android --- RecycleView获取第 i 个 item 里面的控件并进行赋值
- Android --- 命名规范
- Python 字典类型的使用
- Android --- Unable to resolve dependency for ‘:app@debug/compileClasspath‘: Could not resolve com.a
- mysql英文版怎么调中文_MYSQL 5.6安装设置中英文翻译
- php实现返回界面,PHP实现模仿socket请求返回页面的方法
- es重建字段类型_关于elasticsearch中更新数据的几种方式
- 全球海拔最高的国际级数据中心竣工,西藏有了大数据存储中心
- Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)
- Paper之IEEERSJ:2009年~2019年机器人技术(IEEE机器人和自动化国际会议RSJ智能机器人与系统国际会议机器人技术:科学与系统机器人学报)历年最佳论文简介及其解读