inet_aton和inet_network和inet_addr三者比较-《别怕Linux编程》之五
来源:互联网 发布:centos 查看cpu核数 编辑:程序博客网 时间:2024/06/05 07:14
转自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编程》之五
- inet_aton和inet_network和inet_addr三者比较-《别怕Linux编程》之五
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr三者比较
- inet_aton和inet_network和inet_addr
- inet_addr和inet_aton比较
- inet_addr、inet_aton 、inet_network
- inet_addr()、inet_network()、inet_aton()的区别
- 函数inet_addr和inet_aton
- inet_addr和inet_aton
- 函数inet_addr和inet_aton
- 所有版本的 QT 编译安装方法
- 必须掌握的八个DOS命令
- ca(数字证书认证中心)知识一箩筐
- C#打包SQL数据库部署安装(转)
- MyEclipse设置工作空间默认编码,使新建工程使用默认编码(很简单,却很多人问)
- inet_aton和inet_network和inet_addr三者比较-《别怕Linux编程》之五
- 归并排序
- windows+lighttpd+php+flash cs3搭建随意拖放视频网站(3)-flash cs3视频播放器的编写
- 枚举 (转贴)
- 进博客第一天
- EDMA在实时图像处理系统中的应用
- 无意中发现一个网站,竟然跟CSDN一模一样。
- 为什么Oracle的伪列rownum不支持>,>=,=,between...and,而都用<
- Mouse position