Socket编程之地址之间转换、字节序转换
目录
char *inet_ntoa(struct in_addr in);
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
int inet_pton(int af, const char *src, void *dst);
地址结构体
字节序转换
notes
char *inet_ntoa(struct in_addr in);
- 函数将网络主机地址转换为点分十进制格式的 IPv4 地址(32位二进制网络字节序的IPV4地址转化为字符串形式的IP的地址)
- 网络主机地址要是网络字节序
例子:
unsigned char remoteIpAddr[IP_ADDR_LEN]="";//单纯32位二进制数
unsigned char sEntry.gateway[IP_ADDR_LEN];
struct in_addr inAddr;
//字节序转换后才是网络主机地址(网络字节序)
inAddr.s_addr = entry.remoteIpAddr[0]<< 24 | entry.remoteIpAddr[1] << 16 | entry.remoteIpAddr[2] << 8 | entry.remoteIpAddr[3];
//再转为点分十进制ipv4地址
strcpy(sEntry.gateway, inet_ntoa(inAddr));
- inAddr:无符号32位网络地址结构体
struct in_addr
{
in_addr_t s_addr; // 无符号32位网络地址
};
int inet_aton(const char *cp, struct in_addr *inp);
- 函数将网络主机地址从 IPv4 的点分十格式转换为二进制值(以网络字节序)
- 此转换后的地址保存在保存在
inp
指针指向的结构体中- 如果地址是合法的,那么
inet_aton
函数返回非 0 值,反之返回 0 值。
in_addr_t inet_addr(const char *cp);
- 函数将网络主机地址从 IPv4 的数字点表示形式(字符串)转换为以网络字节顺序的二进制形式。
(IP地址字符串转化32位二进制网络字节序的IPV4地址,cp:字符串形式IPV4地址)
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
- 将 IPv4 和 IPv6 地址从二进制转换为点分十进制(二进制地址转化为文本地址)
inet_ntop
拓展自inet_ntoa
来支持多种地址类型协议簇,inet_ntoa
现在已经被弃用。inet_ntop
执行成功,返回一个指向dst
的非空指针(即指针指向转换后的点分十进制ip),如果执行失败,将返回NULL
,并且errno
设置为相应的错误类型。- ipv6地址转时,src:强转为(struct in6_addr *)
int inet_pton(int af, const char *src, void *dst);
- 将 IPv4 和 IPv6 地址从点分十进制转换为二进制(文本地址转化为二进制地址)
- 对于
af
参数,必须为AF_INET
(ipv4)或AF_INET6(ipv6)
- 转换成功则返回 1,将转换失败,返回 0, 如果指定的地址类型协议簇不合法,将返回 - 1 ,并且
errno
设置为EAFNOSUPPORT
地址结构体
- 通用地址结构体的定义:
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
};
- 特殊地址结构体 —— IPv4地址结构体:
struct sockaddr_in
{
u_short sin_family; // 地址族
u_short sin_port; // 端口
struct in_addr sin_addr; // IPV4地址,
还是一个结构体 (XXX. sin_addr. s_addr);
char sin_zero[8]; //预留的成员
};
struct in_addr
{
in_addr_t s_addr; // 无符号32位网络地址
};
- 特殊地址结构体 —— IPv6地址结构体:
struct sockaddr_in6
{
u_short sin6_family; // 地址族
__be16 sin6_port; // 端口
__be32 sin6_flowinfo; // 流信息
struct in6_addr sin6_addr; // IPv6地址
__u32 sin6_scope_id;
};
字节序转换
接口声明:
- 把主机字节序(小端序)32位无符号整型转化为网络字节序(大端序)
uint32_t htonl(uint32_t hostlong);
h:host主机
to:转换
n:网络
l:long
- 把主机字节序16位无符号整型转化为网络字节序
uint16_t htons(uint16_t hostshort);
- 把网络字节序32位无符号整型转化为主机字节序
uint32_t ntohl(uint32_t netlong);
- 把网络字节序16位无符号整型转化为主机字节序
uint16_t ntohs(uint16_t netshort);
参数:
hostlong: 主机字节序的长整型数据
hostshort: 主机字节序的短整型数据
netlong: 网络字节序的长整型数据
netshort: 网络字节序的短整型数据
1、点分十进制
点分十进制(DottedDecimalNotation)全称为点分(点式)十进制表示法,是IPv4的IP地址标识方法。IPv4中用四个字节表示一个IP地址,每个字节按照十进制表示为0~255。点分十进制就是用4个从0至255的数字,来表示一个IP地址。
2、网络字节序
在网络传输中,TCP/IP协议在保存IP地址这个32位二进制数时,协议规定采用在低位存储地址中包含数据的高位字节的存储顺序(大头),这种顺序格式就被称为网络字节顺序格式。在实际网络传输时,数据按照每32位二进制数为一组进行传输,由于存储顺序的影响,实际的字节传输顺序是由高位字节到低位字节的传输顺序。网络字节顺序格式的地址不受主机、路由器类型的影响,它的表示是唯一的。
3、主机字节序
主机字节序格式顾名思义,其IP地址的格式是和具体主机或者路由器相关的。对于不同的主机,在进行IP地址的存储时有不同的格式,比如对于Motorola68k系列主机,其HBO与NBO是相同的。而对于Intelx86系列,HBO与NBO则正好相反。
IP地址(32位二进制):11001010011001010110100101000010
分成4组后:11001010 01100101 01101001 01000010
十进制表示:202 101 105 66
点分表示:202.101.105.66
notes
inept_pton
支持 IPv6 地址。另一方面,inet_pton
仅支持点分十进制表示的 IPv4 地址,而inet_aton
和inet_addr
接受更通用的数字和点表示法(十六进制和八进制数字格式,以及格式不需要显式写入所有四个字节)。- 在 x86 架构中,主机字节顺序首先是最低有效字节(小端),而在因特网上使用的网络字节顺序是最高有效字节(大端)。
(网络字节序)大端序:高位数据存储到低位地址,低位数据存储到高位地址
(主机字节序)小端序:高位数据存储到高位地址,低位数据存储到低位地址
X86属于小端序,ARM平台属于小端序,但是也可以设置为大端序,网络字节序是大端序
Socket编程之地址之间转换、字节序转换相关推荐
- 【Socket网络编程】3.字节序转换函数htons、htonl ,地址转换函数inet_ntoa、inet_ntop、inet_pton、inet_addr
字节序转换函数htons.htonl 地址转换函数inet_ntoa.inet_ntop.inet_pton.inet_addr 1.字节序转换函数 #include <arpa/inet.h& ...
- OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现
1.网络以覆盖范围划分:局域网/城域网/广域网 互联网/因特网 以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信 IP地址: ...
- 关于高位字节与低位字节简洁明了的说明,以及高低字节序转换函数
一般一个16位(双字节)的数据,比如 FF1A (16进制) 那么高位字节就是FF,低位是1A 如果是32位的数据,比如 3F68415B 高位字(不是字节)是3F68 低位字是415B 右边是低 ...
- 使用htons和ntohs进行字节序转换的理解
字符数组中存储顺序,可以理解为是内存中存储的顺序!!!!! 1.示例 uint16_t value = 0xabcd; uchar ch[2]; memcpy(ch,&value,size ...
- c/c++字节序转换
字节序(byte order)关系到多字节整数(short/int16.int/int32,int64)和浮点数的各字节在内存中的存放顺序.字节序分为两种:小端字节序(little endian)和大 ...
- c/c++字节序转换(转)
字节序(byte order)关系到多字节整数(short/int16.int/int32,int64)和浮点数的各字节在内存中的存放顺序.字节序分为两种:小端字节序(little endian)和大 ...
- 网络通信之 字节序转换原理与网络字节序、大端和小端模式
一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节, ...
- node 16位 转24位_C代码实现16位和32位数据字节序转换
点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 每天给自己一个存在的意识,这样才会有一颗认真的心. 文 章 导 读 今天给大家用C代码实现下大小端字节序的转换代码,感谢的小伙伴可以拿下来撸一 ...
- 网络通信时字节序转换原理与网络字节序、大端和小端模式 .
引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换.原因如下:网络协议规定接收到得第一个字节是高字节, ...
最新文章
- 调整数组顺序使奇数位于偶数前面【不保持相对位置】
- Android SurfaceView的生命周期
- keras 提取某一层的feature_map
- 树莓派3开wifi热点
- android data binding jetpack III 绑定一个方法
- 样式中文字和图片对齐问题
- 阿里工程师养了只“二哈”,专治讨厌的骚扰电话
- 算法测试及对比度进一步增强
- Tomcat详解(四)——Tomcat配置详解
- matlab拟合gamma分布,使用matlab拟合Gamma分布
- 如何用笔记本组建家庭点歌系统
- 核信百度空间互踩工具v1.0.0 免费绿色版下载
- 金融创新推动资产管理公司发展
- 辨别尸体死亡时间! [转]
- GBASE 8s UDR内存管理_05_mi_free
- Android中实现微信分享的功能
- Python3正则表达式:match函数
- 云服务器 - 腾讯云主机信息
- GWAS计算BLUE值4--联合方差分析演示
- 严格校验身份证,最后一位如果是X 需大写
热门文章
- MySQL远程连接提示Accesss denied for user 'root'@'此处为你自己的ip'(using password:YES)
- Keil MDK编译出现..\USER\stm32f10x.h(428): error: #67: expected a “}“错误的解决办法
- 执行exe报计算机中丢失qtdll,Qt入门教程(2) 直接运行Qt生成的exe报错缺少dll文件 | 阿拉灯...
- java计算机毕业设计国产精品动漫网站源码+mysql数据库+系统+lw文档+部署
- 新生代、老生代垃圾收集器总结
- 第150篇 笔记-元宇宙(Metaverse)
- Objective-C 杂志发布四月 Android 特刊
- 转 基于MySQL MEB的备份恢复
- EC20 raspberry pi 树莓派 4g上网 发短信
- 创建JavaEE项目