目录

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);

  1. 函数将网络主机地址转换为点分十进制格式的 IPv4 地址(32位二进制网络字节序的IPV4地址转化为字符串形式的IP的地址)
  2. 网络主机地址要是网络字节序

例子:

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);

  1. 函数将网络主机地址从 IPv4 的点分十格式转换为二进制值(以网络字节序)
  2. 此转换后的地址保存在保存在 inp 指针指向的结构体中
  3. 如果地址是合法的,那么 inet_aton 函数返回非 0 值,反之返回 0 值。

  • in_addr_t inet_addr(const char *cp);

  1. 函数将网络主机地址从 IPv4 的数字点表示形式(字符串)转换为以网络字节顺序的二进制形式。

(IP地址字符串转化32位二进制网络字节序的IPV4地址,cp:字符串形式IPV4地址)

  • const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

  1. 将 IPv4 和 IPv6 地址从二进制转换为点分十进制(二进制地址转化为文本地址)
  2. inet_ntop 拓展自 inet_ntoa 来支持多种地址类型协议簇,inet_ntoa 现在已经被弃用。
  3. inet_ntop 执行成功,返回一个指向 dst 的非空指针(即指针指向转换后的点分十进制ip),如果执行失败,将返回 NULL,并且 errno 设置为相应的错误类型。
  4. ipv6地址转时,src:强转为(struct in6_addr *)
  • int inet_pton(int af, const char *src, void *dst);

  1. 将 IPv4 和 IPv6 地址从点分十进制转换为二进制(文本地址转化为二进制地址)
  2. 对于 af 参数,必须为 AF_INET (ipv4)或 AF_INET6(ipv6)
  3. 转换成功则返回 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

  1. inept_pton 支持 IPv6 地址。另一方面,inet_pton 仅支持点分十进制表示的 IPv4 地址,而 inet_aton 和 inet_addr 接受更通用的数字和点表示法(十六进制和八进制数字格式,以及格式不需要显式写入所有四个字节)。
  2. 在 x86 架构中,主机字节顺序首先是最低有效字节(小端),而在因特网上使用的网络字节顺序是最高有效字节(大端)。
  3. (网络字节序)大端序:高位数据存储到低位地址,低位数据存储到高位地址

    (主机字节序)小端序:高位数据存储到高位地址,低位数据存储到低位地址

    X86属于小端序,ARM平台属于小端序,但是也可以设置为大端序,网络字节序是大端序

Socket编程之地址之间转换、字节序转换相关推荐

  1. 【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& ...

  2. OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现

    1.网络以覆盖范围划分:局域网/城域网/广域网   互联网/因特网   以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信            IP地址: ...

  3. 关于高位字节与低位字节简洁明了的说明,以及高低字节序转换函数

    一般一个16位(双字节)的数据,比如 FF1A  (16进制) 那么高位字节就是FF,低位是1A 如果是32位的数据,比如  3F68415B 高位字(不是字节)是3F68 低位字是415B 右边是低 ...

  4. 使用htons和ntohs进行字节序转换的理解

    字符数组中存储顺序,可以理解为是内存中存储的顺序!!!!! 1.示例 uint16_t   value = 0xabcd; uchar ch[2]; memcpy(ch,&value,size ...

  5. c/c++字节序转换

    字节序(byte order)关系到多字节整数(short/int16.int/int32,int64)和浮点数的各字节在内存中的存放顺序.字节序分为两种:小端字节序(little endian)和大 ...

  6. c/c++字节序转换(转)

    字节序(byte order)关系到多字节整数(short/int16.int/int32,int64)和浮点数的各字节在内存中的存放顺序.字节序分为两种:小端字节序(little endian)和大 ...

  7. 网络通信之 字节序转换原理与网络字节序、大端和小端模式

    一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节, ...

  8. node 16位 转24位_C代码实现16位和32位数据字节序转换

    点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 每天给自己一个存在的意识,这样才会有一颗认真的心. 文 章 导 读 今天给大家用C代码实现下大小端字节序的转换代码,感谢的小伙伴可以拿下来撸一 ...

  9. 网络通信时字节序转换原理与网络字节序、大端和小端模式 .

    引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换.原因如下:网络协议规定接收到得第一个字节是高字节, ...

最新文章

  1. 调整数组顺序使奇数位于偶数前面【不保持相对位置】
  2. Android SurfaceView的生命周期
  3. keras 提取某一层的feature_map
  4. 树莓派3开wifi热点
  5. android data binding jetpack III 绑定一个方法
  6. 样式中文字和图片对齐问题
  7. 阿里工程师养了只“二哈”,专治讨厌的骚扰电话
  8. 算法测试及对比度进一步增强
  9. Tomcat详解(四)——Tomcat配置详解
  10. matlab拟合gamma分布,使用matlab拟合Gamma分布
  11. 如何用笔记本组建家庭点歌系统
  12. 核信百度空间互踩工具v1.0.0 免费绿色版下载
  13. 金融创新推动资产管理公司发展
  14. 辨别尸体死亡时间! [转]
  15. GBASE 8s UDR内存管理_05_mi_free
  16. Android中实现微信分享的功能
  17. Python3正则表达式:match函数
  18. 云服务器 - 腾讯云主机信息
  19. GWAS计算BLUE值4--联合方差分析演示
  20. 严格校验身份证,最后一位如果是X 需大写

热门文章

  1. MySQL远程连接提示Accesss denied for user 'root'@'此处为你自己的ip'(using password:YES)
  2. Keil MDK编译出现..\USER\stm32f10x.h(428): error: #67: expected a “}“错误的解决办法
  3. 执行exe报计算机中丢失qtdll,Qt入门教程(2) 直接运行Qt生成的exe报错缺少dll文件 | 阿拉灯...
  4. java计算机毕业设计国产精品动漫网站源码+mysql数据库+系统+lw文档+部署
  5. 新生代、老生代垃圾收集器总结
  6. 第150篇 笔记-元宇宙(Metaverse)
  7. Objective-C 杂志发布四月 Android 特刊
  8. 转 基于MySQL MEB的备份恢复
  9. EC20 raspberry pi 树莓派 4g上网 发短信
  10. 创建JavaEE项目