IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【网络编程】2.字节序以及地址转换 -> 正文阅读

[网络协议]【网络编程】2.字节序以及地址转换

一、字节序

1.分类

小端格式:将低位字节数据存储在低地址

大端格式:将高位字节数据存储在低地址

linux中采用的是小段存储格式

2.特点

  • 网络协议指定了通讯字节序为大端格式
  • 只有在多字节数据处理时才需要考虑字节序
  • 运行在同一台计算机上的进程相互通讯是一般不需要考虑字节序
  • 异构计算机之间的通讯,需要转换自己的字节序为网络字节序

3.字节序转换函数

linux中提供了专门转换字节序的函数,以下函数中h表示的是host,表示的是主机,n表示的是network,表示的是网络,l结尾的使用在32位数据的转换上,s结尾的使用在16位数据的转换上。

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostint32);
功能:将32位主机字节序数据转换成网络字节序数据
参数:待转换的32位主机字节序数据
返回值:成功返回网络字节序的值

uint16_t htons(uint16_t hostint16);
功能:将16位主机字节序数据转换成网络字节序数据
参数:待转换的16位主机字节序数据
返回值:成功返回网络字节序的值

uint32_t ntohl(uint32_t netint32);
功能:将32位网络字节序数据转换成主机字节序数据
参数:待转换的32位主机字节序数据
返回值:成功返回主机字节序的值

uint16_t ntohs(uint16_t netint16);
功能:将16位网络字节序数据转换成主机字节序数据
参数:待转换的16位主机字节序数据
返回值:成功返回主机字节序的值

?举个例子:

#include <stdio.h>
#include <arpa/inet.h>

int main(){
    int a = 0x12345678;
    short b = 0x9876;

    printf("a = %#x",htonl(a));
    printf("b = %#x",htons(b));

    return 0;
}

二、地址转换函数

1.为何需要地址转换?

为了方便人为识别网络地址,我们一般使用的是点分十进制来表示ip地址,如192.168.1.88这样子,点分十进制实际上就是一串字符串,计算机是看不懂,计算机识别的ip的值(ipv4)是一串32位的无符号整形数据,所以我们需要将我们认识的点分十进制转换成32位数据就需要到地址转换函数。

2.inet_pton函数

#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);

功能:将点分十进制的ip地址转换为无符号整型

参数:af:协议族?

????????????????AF_INET ipv4网络协议

? ? ? ? ? ? ? ? AF_INET6 ipv6网络协议

? ? ? ? src:点分十进制字符串

? ? ? ? dst:无符号整形ip地址的保存地址

返回值:成1? 败其他

?3.inet_ntop函数

#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

功能:将32位的无符号整形ip地址转换为点分十进制

参数:?????af:协议族

? ? ? ? ? ? ? ? src:ip地址数据

? ? ? ? ? ? ? ? dst:点分十进制ip地址的保存地址

? ? ? ? ? ? ? ? size:dst缓存区的大小,有两个宏可以选择,分别用来保存ipv4和ipv6、????????????????????????

? ? ? ? ? ? ? ? ? ? ? ? #define INET_ADDRSTRLEN 16

? ? ? ? ? ? ? ? ? ? ? ? #define INET6_ADDRSTRLEN 46

返回值:成功返回字符串的首地址? 失败返回NULL

4.实例

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main(){

	char *str = "192.168.1.88";
	unsigned int addr = 0;
	if(inet_pton(AF_INET,str,&addr)!=1){
		perror("fail to inet_pton");
		exit(1);
	}
	printf("ip:%d\n",addr);

	char buf[16];
	if(inet_ntop(AF_INET,&addr,buf,INET_ADDRSTRLEN)==NULL){
		perror("fail to ntop");
		exit(1);
	}
	printf("ip:[%s]\n",buf);
    return 0;
}

5.inet_addr函数和inet_ntoa函数

?这两个函数只能用在ipv4的地址转换上

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
功能:由点分十进制得到32位的无符号整型IP地址
参数:点分十进制地址
返回值:成功返回整形ip
char *inet_ntoa(struct in_addr in);
功能:由32位无符号整形ip得到点分十进制
参数:保存ip地址的结构体
返回值:点分十进制的ip地址

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 17:02:28  更:2021-08-12 17:03:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 20:16:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码