【网络】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
1、htonl ()和ntohl( )
u_long PASCAL FAR ntohl (u_long netlong);
u_short PASCAL FAR ntohs (u_short netshort);
ntohl( )-----网络顺序转换成主机顺序
u_long PASCAL FAR htonl (u_long hostlong);
u_short PASCAL FAR htons (u_short hostshort);
htonl ()-----主机顺序转换成网络顺序
2、inet_addr( )和inet_ntoa ( )
unsigned long PASCAL FAR inet_addr (const char FAR * cp);
char FAR * PASCAL FAR inet_ntoa (struct in_addr in);
inet_addr函数需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(例如:192.168.0.16)。而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。
Inet_ntoa函数会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串。
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
上面是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
struct in_addr就是32位IP地址。
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
};
inet_addr()是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)。
填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。
通常的用法是:
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
bzero(&(my_addr.sin_zero), 8);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
可以用C++做个不太准确的假设。
sockaddr是base class
sockaddr_in 等是derived class
如此一来,bind, connect , sendto , recvfrom等函数就可以使用base class
来处理多种不同的derived class了。
但是实际上,这是没有继承关系数据结构(C嘛),所以需要强制造型来转换数据类型。正因为如此,在sendto的时候需要给出len长度,因为不同的sockaddr_xx实现长度并不相同。
名词解析:
主机字节序:
不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。最常见的有两种 1.Little endian:低字节存高地址,高字节存低地址 2.Big endian:低字节存低地址,高字节存高地址
网络字节序:
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
为了进行转换bsd socket提供了转换的函数,有下面四个网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
htons 把unsigned short类型从主机序转换到网络序,htonl 把unsigned long类型从主机序转换到网络序,ntohs 把unsigned short类型从网络序转换到主机序,ntohl 把unsigned long类型从网络序转换到主机序。
在使用little endian的系统中 这些函数会把字节序进行转换 在使用big endian类型的系统中这些函数会定义成空宏。
将用点分割的IP地址转换位一个in_addr结构的地址,这个结构的定义见笔记(一),实际上就是一个unsigned long值。计算机内部处理IP地址可是不认识如192.1.8.84之类的数据。
unsigned long inet_addr( const char FAR * cp );
举例:inet_addr("192.1.8.84")=1409810880
inet_addr("127.0.0.1")= 16777343
如果发生错误,函数返回INADDR_NONE值。
将网络地址转换位用点分割的IP地址,是上面函数的逆函数。
char FAR * inet_ntoa( struct in_addr in );
举例:char * ipaddr=NULL;
char addr[20];
in_addr inaddr;
inaddr. s_addr=16777343;
ipaddr= inet_ntoa(inaddr);
strcpy(addr,ipaddr);
这样addr的值就变为127.0.0.1。
注意不要修改返回值或者进行释放动作,如果函数失败就会返回NULL值。
转载于:https://www.cnblogs.com/kotete/p/6129486.html
【网络】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)相关推荐
- 大小端、字节顺序转换函数和IP地址格式转换函数
大小端.字节顺序转换函数和IP地址格式转换函数 大小端 CPU大小端之分 常见字节序 字节顺序转换函数 Linux系统下定义 Windows系统下 ntohs() htons() htonl()和nt ...
- 防火墙关键技术(包过滤、应用代理、网络ip地址转换)
目录 数据包过滤 包过滤优点 包过滤缺点 应用代理 应用代理优点 应用代理缺点 网络IP地址转换(NAT) 数据包过滤 网络上的数据都是以包为单位进行传输的,每一个数据包中都会包含一些特定的信息,如数 ...
- 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...
- IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...
- ip地址转换htonl的用法
说明 u_long PASCAL FAR htonl ( __in u_long hostlong); htonl(将32位主机字符顺序转换成网络字符顺序)(用于IP的转换) IP转换为数值 unsi ...
- java转换ip地址格式转换_Java编程IP地址和数字相互转换代码示例
最近才知道,将ip地址转换成十进制.八进制.十六进制同样可以访问网站. IP转为数字(第二种算法.用左移.按位或实现.效率更高.): public long ipToLong(String ipAdd ...
- ip地址转换数字函数 iton_esp8266 inet_ntoa函数实现 ip地址转换为字符串 MAC地址转字符串...
esp8266芯片可作为mcu,功能很强大,但与传统mcu相比,可用资源实在不多,连浮点数都不支持 IP地址转字符创函数inet_ntoa很方便,但8266中没有!!!!! 本节将讲述如何自己实现in ...
- linux 网址转换工具,Linux下强大IP地址格式转换工具--netmask命令
由于一般的路由器.防火墙等并不支持IP地址范围的方式,所以工作中经常要把IP地址范围转换成子网掩码的格式.CIDR格式.思科反向子网掩码格式等! 虽然windows下有些工具可以做到,可是使用起来不方 ...
- Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)
Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_n ...
最新文章
- python用numpy和pil处理图像成灰度图_「火炉炼AI」机器学习047-图像的直方图均衡化操作...
- 算法分析与设计——蛮力法0/1背包
- exit命令的返回值
- 问答项目---登陆也要做验证!(JS和PHP验证)
- Mysql-高性能索引
- React的生命周期(旧)
- 计算一个人出生了多少天(炸窝)
- 使用openswan构建lan-to-lan ×××(KLIPS)
- DXperience GridControl 根据内容动态显示图标
- 安卓帧数监测软件_手机帧数测试软件-手机fps帧数显示软件1.6 免root版-东坡下载...
- FishC笔记—29 讲 文件:一个任务
- 成功在中东和北非地区发布应用或游戏的 7 个技巧
- 简单的安卓木马制作(实现外网控制)
- Endnote X6大客户版破解版+新功能介绍+视频介绍
- Hacked by 1BYTE
- 微信小程序:小程序内用户帐号登录规范调整和优化建议
- java记录日志不打印控制台,java异常在控制台和日志里面的打印记录
- 编译原理 —— 逆波兰式
- Flask入门教程(视频教程笔记)
- 学生id号码是什么意思_学生学籍中的ID号是学籍号吗?
热门文章
- file-max与ulimit的设置,nginx 500错误的原因
- Stimulsoft Reports ASP.NET HTML5报表设计器
- java实现的判断括号是否成对的代码,()[]{}都可以
- 使用Controller.UpdateModel方法来更新ViewModel
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)
- 总结几个与模块相关的命令
- winlogon病毒清除
- python批量转换文件编码
- 鸿蒙电视应用市场,任正非:鸿蒙系统已上线,未来将被应用到手机、平板、电视系列产品上...
- MongoDB 运行状态、性能监控,分析