网络通信之大小端、字节序转换函数

2023-05-16

在上篇文章中我们提到了UDP,TCP有关函数,并知道了一个重要的结构体struct sockaddr。想要实现通信首先要知道通信端的地址,所以首先了解一下IPv4套接字地址结构体。

//IPv4 套接字地址结构体,用来存放地址信息
struct sockaddr_in    //此结构体大小是16字节
{
    sa_family_t sin_family;  //2 字节 协议族(AF_INET、AF_INET6、PF_PACKET)
    in_port_t sin_port;      //2 字节 端口
    struct in_addr sin_addr; //4 字节 地址
    char sin_zero[8]         //8 字节  必须为0
};
struct in_addr
{
    in_addr_t s_addr;     //4 字节
};

注意 : 为了使不同格式地址能被传入套接字函数,地址须要强制转换成通用套接字地址结构。

//此结构体大小是16字节,函数参数的类型是此结构体,但其没有表示地址信息的成员变量,
//所以用IPv4结构体定义,强转成这个就可以了。(关键:大小一样)
struct sockaddr  
{
    sa_family_t sa_family;    // 2 字节
    char sa_data[14];         //14 字节
};  //通用套接字地址结构体,一般用来强转IPv4结构体

所以现在就是怎样给IPv4结构体赋值的问题了。
例子 :

//定义服务器IPv4地址结构(假设服务器的IP10.0.110.110  port=8080)
struct sockaddr_in server_addr;    //定义变量
//memset(&server_addr,0,sizeof(server_addr));   //清空1
bzero(&server_addr,sizeof(server_addr));     //清空2
//给成员变量赋值
server_addr.sin_family = AF_INET;		//ipv4协议
server_addr.sin_port = htons(8080);		 //给端口赋值,htons作用未知
inet_pton(AF_INET,"10.0.110.110",&server_addr.sin_addr.s_addr)  // 给ip地址赋值,inet_pton作用未知

接下来了解网络编程中的字节序(大小端)、字节序转换函数和地址转换函数。
1.字节序
概念:多字节数据的存储顺序
分类:
(1)大端格式:将高位字节数据存储在低位地址上
(2)小端格式:将低位字节数据存储在低位地址上
字节序
特点
1、网络协议指定了通讯字节序——大端
2、只有在多字节数据处理时才需要考虑字节序
3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序
4、异构计算机之间通讯,需要转换自己的字节序为网络字节序
确定主机的字节序程序。(了解)

#include <stdio.h>
union{
	short s;
	char c[sizeof(short)];
}un;  //公用同一块空间

int main(int argc, const char *argv[])
{
	un.s =0x0102;
	if((un.c[0]==1)&&(un.c[1]==2))  
		printf("big-endian\n");
	if((un.c[0]==2)&&(un.c[1]==1))
		printf("little-endian\n");
	return 0;
}

2.字节序转换函数
注意 : 在需要字节序转换的时候一般调用特定字节序转换函数。
(1)htonl 函数

uint32_t htonl(uint32_t hostint32);
功能:32位主机字节序数据转换成网络字节序数据
参数:
	@hostint32    :      待转换的 32 位主机字节序数据
返回值:
	成功:返回网络字节序的值  失败:一般不失败
注意:
	将主机字节序的IP地址转换成网络字节序的IP地址。(重点)
头文件:
	#include <arpa/inet.h>

(2)htons 函数

uint16_t htons(uint16_t hostint16);
功能:16位主机字节序数据转换成网络字节序数据
参数:
	@hostint16    :    待转换的 16 位主机字节序数据
返回值:
	成功:返回网络字节序的值   失败:一般不失败
注意:
	将主机字节序的port端口号转换成网络字节序的port端口号(重点)
头文件:
	#include <arpa/inet.h>

在上面给IPv4结构体变量赋值是用到的htons函数,应该就容易理解了。

(3)ntohl 函数

uint32_t ntohl(uint32_t netint32);
功能:32位网络字节序数据转换成主机字节序数据
参数:
	@netint32     :     待转换的32位网络字节序数据
返回值:
	成功:返回主机字节序的值
注意:
	将网络字节序的IP地址转换成主机字节序的IP(一般在对接收的数据分析时用来查看ip)
头文件:
	#include <arpa/inet.h>

(4)ntohs 函数

uint16_t ntohs(uint16_t netint16);
功能:16位网络字节序数据转换成主机字节序数据
参数:
	@netint16     :       待转换的16位网络字节序数据
返回值:
	成功:返回主机字节序的值
注意:
	将网络字节序的port端口号转换成主机字节序的port端口号(一般在对接收的数据分析时用来查看ip)
头文件:
	#include <arpa/inet.h>

3.地址转换函数
在网络通信中IP地址是32位,实际中是点分十进制数串(10.0.110.110直观)。
(1)inet_pton 函数

字符串ip地址转整型数据  (点分十进制数串 转 32位网络字节序IP)
int inet_pton(int family,const char *strptr, void *addrptr);
功能:将点分十进制数串转换成32位无符号整数
参数:
	@family    :    协议族
	@strptr    :    点分十进制数串(:10.0.110.110)
	@addrptr   :    32位无符号整数的地址
返回值:
	成功:返回1      失败:其它
头文件:
	#include <arpa/inet.h>

在上面给IPv4结构体变量赋值是用到的inet_pton函数,应该就容易理解了。

(2)inet_ntop 函数

整型数据转字符串格式ip地址   (32位网络字节序IP 转 点分十进制数串)
char *inet_ntop(int family, const void *addrptr,char *strptr, size_t len);
功能:32位无符号整数转换成点分十进制数串
参数:
	family         :      协议族
	addrptr        :      32位无符号整数
	strptr         :      点分十进制数串
	len            :      strptr缓存区长度
						  #define INET_ADDRSTRLEN 16  //ipv4
						  #define INET6_ADDRSTRLEN 46 //ipv6
返回值:
	成功:则返回字符串的首地址      失败:NULL
头文件:
	#include <arpa/inet.h>

到这,可以说从TCP三次握手四次握手 、 TCP,UDP有关函数 到 网络通信有关函数已经通了。可以自己写个有关TCP或UDP通信程序了。

朋友,加油!点个关注…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络通信之大小端、字节序转换函数 的相关文章

随机推荐

  • 层次遍历构建二叉树

    span class hljs keyword struct span TreeNode span class hljs keyword int span val span class hljs keyword struct span Tr
  • Jetson tx2 使用 jetpack 4.3刷机全过程

    1 首先准备一台安装有ubuntu 18 04 ubuntu16 04 系统的主机 xff08 host也就是笔记本 xff09 2 在nvidia官网注册一个nvidia的账号用于下载jetpack 4 3时使用 xff08 刷机过程中需
  • 2020/2/21 Linux Socket编程 高级篇——广播

    广播 xff1a 实现一对多的通信 SO BROADCAST选项 它控制了UDP套接字是否能发广播数据报 xff0c 选项类型是int xff0c 非零表示 是 只有UDP能用 xff0c TCP不能 如果是一个广播地址 xff0c 但SO
  • 大小端字节序(Big Endian和Little Endian)

    那么何为字节序 xff08 Endia xff09 呢 xff1f Big Endian是指低地址存放最高有效字节 xff08 MSB xff09 xff0c 而Little Endian则是低地址存放最低有效字节 xff08 LSB xf
  • GPS定位及通信协议解析

    1 简介 上图为某公司的GPS定位模块 xff0c 自己在使用其进行GPS定位过程中学习到的知识分享给大家 主要参数如下 半双工 UART 3 3V TTL 电平 RS232 IIC CAN 接口输出 xff0c 更快速的应用 xff1b
  • JVM系列(八):堆(Heap)的相关知识介绍

    目录 1 JVM堆的概念 2 JVM堆的特点 3 JVM堆的内部结构 3 1 组成 3 2 堆内存内部空间所占比例 3 3 永久代和元空间区别 4 堆空间的大小设置 5 堆空间垃圾回收 1 JVM堆的概念 JVM中的堆是用来存放对象的内存空
  • C++读写TIF格式

    参考文章 xff1a xff08 1 xff09 https www cnblogs com gywei p 3393816 html xff08 2 xff09 https blog csdn net han jiang xue arti
  • matlab Fourier变换--方波信号的分解与重建

    N 61 200 采用的数据点数 dt 61 4 N 采样的间隔 for n 61 1 N 生成一个方波 if n dt gt 61 2 x n 61 0 8 else x n 61 0 8 end end figure subplot 2
  • matlab 小波分析--高通滤波器和低通滤波器

    xff08 一 xff09 加载一个尺度滤波器 load db8 w 61 db8 figure subplot 4 2 1 stem w title 39 原尺度滤波器 39 计算4个滤波器 Lo D Hi D Lo R Hi R 61
  • C/C++中rand() 函数产生随机数与srand()设置随机数种子

    xff08 1 xff09 rand 产生随机数 xff0c 输出的随机数序列是确定的 xff0c 即每次运行结果一致 include lt iostream gt int main int i j for i 61 0 i lt 10 i
  • matlab与数字图像处理--膨胀和腐蚀

    对于初学者 xff0c 参考一篇很好的说明 xff1a https blog csdn net alw 123 article details 83868878 左边是一个二值化的测试图像 xff0c 白色为图像元素 xff0c 黑色为背景
  • Emmet语法

    Emmet语法 1 1 快速生成HTML结构语法1 2 快速生成CSS样式语法1 3 快速格式化代码 Emmet语法的前身是Zen coding 它使用缩写 来提高html css的编写速度 Vscode内部已经集成该语法 快速生成HTML
  • CString,int,string,char*之间的转换

    C 43 43 标准函数库 中说的 有三个函数可以将字符串的内容转换为字符数组和C string 1 data 返回没有 0 的字符串数组 2 c str xff0c 返回有 0 的字符串数组 3 xff0c copy int 转 CStr
  • C++ TCP网络编程--服务器端多线程处理会话连接

    客户端程序 xff1a include lt winsock h gt include lt iostream gt pragma comment lib 34 ws2 32 lib 34 include lt Windows h gt i
  • matlab复杂函数多元函数拟合

    简介 本文介绍了基于matlab实现的复杂函数以及多元函数的拟合 在工程和研究中偶尔会遇到要用一个非常复杂的数学公式来拟合实验测量数据 xff0c 对这些复杂的数学公式拟合时 xff0c 采用常见的拟合方法往往会失败 xff0c 或者得不到
  • 基于模板替换的word文档自动生成

    简介 word文档自动生成程序是一个根据用户提供的模板word文档以及一些必要的数据文件来渲染生成所要的word文档的工具 关键词 xff1a 批量word文档生成 word文档渲染 自动生成word 使用场景 xff1a 几种典型的可以采
  • word文档-样例1-模板文档

  • word文档-样例1-结果文档

  • Omnibus F4V3 Pro飞控,APM飞控显示电池电压电流

    默认时 xff0c Omnibus F4 Pro烧写APM飞控后 xff0c 电池检测器没有设置的 想要屏幕上显示电池电压和电流信息 xff0c 就需要设置一下 设置信息如下 xff1a BATT MONITOR 61 4 然后重启 xff
  • 网络通信之大小端、字节序转换函数

    在上篇文章中我们提到了UDP xff0c TCP有关函数 xff0c 并知道了一个重要的结构体struct sockaddr 想要实现通信首先要知道通信端的地址 xff0c 所以首先了解一下IPv4套接字地址结构体 span class t