当前位置: 首页 > news >正文

scoket通信 -- 网络字节序

include <arpa/inet.h>

考虑到不同语言不同库函数的参数可能不同,我这里以c语言的arpa/inet.h库中的函数为例.

网络字节序是什么

网络字节序(Network Byte Order)是指在网络通信中用于数据交换时所采用的字节序,它是大端字节序(Big-Endian)。网络字节序确保了在不同计算机架构之间传输数据时的一致性,特别是涉及到多字节数据类型(如整数、浮点数等)的传输。

网络字节序转换

在socket通信过程中,数据不断的从网络到主机,从主机到网络,这其中涉及大量的数据转换问题,同时也产生了大量的转换函数,用于网络字节序与主机字节序的转换,这其中纷繁复杂,我也是一知半解,仅以此记录。

htons(),htonl()

Host to Network Short,Host to Network long,主要就是用于将本地ip地址转换为网络字节序

Host to Network Short一般是用于端口号的转换,short占两个字节端口号也是占两个字节

htons()的参数与返回值都是16位的无符号整型
在这里插入图片描述

Host to Network long一般是用于网络号的转换,将32位的ip地址进行转换
htonl()的参数与返回值都是32位的无符号整型,而ip地址是字符数组或者说是字符串类型,在转换时不能直接使用htonl()这个函数,而是需要将其先从char[]类型转为int型

atoi()

这个函数可以将string类型转换为int型的数据,但是这样两步走的方法在我们看来挺麻烦,所以有inet_ntop()函数和inet_pton()函数,待会介绍.

ntohl()和ntohs()

Network to Host Long,Network to Host Short,主要就是用于将网络字节序ip地址转换为本地字节序
上面四个函数的参数都要求是整型,而ip地址都是在主机中是以字符串的形式存在(“127.0.0.1”),所以我们要想使用还得将其转为int才能再转为,那样自然就很麻烦。

inet_pton()和inet_ntop()

inet_pton

inet_pton 是一个网络编程中使用的函数,它用于将一个点分十进制格式的IP地址转换为网络字节顺序的二进制格式。

int inet_pton(int af, const char *src, void *dst);

第一个参数AF是传输协议 常见有两种AF_INET和IAF_INET6.
第二个参数是IP地址,作为传入参数数
第三个参数是输出参数网络字节顺序的二进制格式
成功返回 1
异常返回0 : 有可能是传入一个无效的ip地址
失败返回-1

inet_ntop()

inet_pton 是一个网络编程中使用的函数,它用于将一个网络字节顺序的二进制格式转换为点分十进制格式的IP地址。

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

值得一提的是inet_ntop()的第四个参数表示的是dst缓冲区的大小。而inet_pton不需要第四个参数的原因在于inet_pton()函数的作用仅仅是将主机字节序的IP地址转换为网络字节序的IP地址,但不会去使用这个ip地址,但inet_ntop()函数的返回值是有可能要用到的。

inet_addr(const char *_cp)

inet_pton()和inet_ntop()函数都是既可以适配ipv4又可以适配ipv6的,而inet_addr()函数可以将字符串类型的ip地址转换为32int类型的数据,却仅仅适配ipv4.

//在这种情况下,两种方法都可以
connect_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//inet_pton(AF_INET,"127.0.0.1",&connect_addr.sin_addr.s_addr);
connect_addr.sin_family = AF_INET;
connect_addr.sin_port = htons(PORT);
connect(client_fd, (struct sockaddr *)&connect_addr, sizeof(connect_addr)

#注:事实上,像这种函数还有很多,我也看到很多不同的函数却都能实现目标,也是很头大了,但是就目前来看,inet_pton()和inet_ntop()基本是万能的.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QT:QTableWidget 设置单元格边距
  • 【gitlab】gitlab-ce:17.3.0-ce.0 1:使用docker engine安装
  • 选择排序(C语言)以及选择排序优化
  • 学习C语言第十七天
  • 数据结构day02(链表)
  • luckyexcel 编辑预览excel文件
  • 【机器学习第9章——聚类】
  • elasticsearch 字段类型的索引、字段类型修改、字段类型、分页、排序、分组、聚合
  • Java+vue3+element-plus+ts上传图片到服务器并返回图片可访问链接
  • 关于SOA和微服务
  • docker swarm如何让两个副本分别跑在两台不同的主机上
  • ubuntu 24.04 软件源配置,替换为国内源
  • 【GitLab】使用 Docker 安装 GitLab:配置 SSH 端口
  • 数据守护者:SQL一致性检查的艺术与实践
  • dev c++中,在C++11模式下编译带M_PI宏的文件报错的解决办法
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • canvas 绘制双线技巧
  • CAP 一致性协议及应用解析
  • es的写入过程
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • 半理解系列--Promise的进化史
  • 初识 beanstalkd
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 面试遇到的一些题
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 小程序button引导用户授权
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1) caustics\
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (20050108)又读《平凡的世界》
  • (zt)最盛行的警世狂言(爆笑)
  • (二)WCF的Binding模型
  • (六)软件测试分工
  • (面试必看!)锁策略
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)进入MySQL 【事务】
  • (原)Matlab的svmtrain和svmclassify
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Core中的去虚
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET简谈设计模式之(单件模式)
  • .NET开发人员必知的八个网站
  • ?php echo ?,?php echo Hello world!;?
  • [ C++ ] STL---仿函数与priority_queue
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [C/C++入门][字符与ASCII码]6、用代码来转换字符与它的ASCII码
  • [EWS]查找 文件夹
  • [FreeRTOS 基础知识] 栈
  • [GXYCTF2019]BabySQli1
  • [HNOI2008]玩具装箱toy