Linux网络字节序/IP地址转换

网络字节序:

大(高)端字节序(网络字节序):低位地址存放高位数据,高位地址存放低位数据

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

在网络中需要考虑大小端的是IP和端口。

可以通过编写以下代码查看自己的电脑的字节序种类:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
union 
{short s;char c[sizeof(short)];
}un2;
union
{int s;char c[sizeof(int)];
}un4;
int main()
{un2.s=0x0102;printf("[%d],[%d],[%d]\n",un2.c[0],un2.c[1],un2.s);un4.s=0x01020304;printf("[%d],[%d],[%d],[%d],[%d]\n",un4.c[0],un4.c[1],un4.c[2],un4.c[3],un4.s);return 0;
}

可以看出是低端字节序 

网络传输用的是大端法,如果机器用的是小端法,则需要进行大小端的转换。

下面函数可以进行大小端转换:

 #include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);//主机字节序转换为网络字节序长整型uint16_t htons(uint16_t hostshort);//主机字节序转换为网络字节序短整型uint32_t ntohl(uint32_t netlong);//网络字节序转换为主机字节序长整型uint16_t ntohs(uint16_t netshort);//网络字节序转换为主机字节序daunting整型

 IP地址转换函数:

p->表示点分十进制的字符串形式

to->到

n->表示network网络

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

函数说明:将字符串形式的点分十进制IP转换为大端模式的网络IP(整形四字节)

  • 参数:af:AF_INEF
  • src:字符串形式的点分十进制的IP地址
  • dst:存放转换网络IP变量的地址

例如:inet_pton(AF_INEF,"128.0.0.1",&addr);

十进制转十六进制:128->0x80 0->0x00  0->0x00 1->0x01

最后按大端字节序存放:0x01000080,这个就是四字节的整形

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

函数说明:网络IP转换为点分十进制的IP

  • src:网络的整形的IP地址
  • dst:转换后的IP地址,一般为字符串数组
  • size:dst的长度,一般为16
  • 返回值:成功返回指向dst的指针;
  • 失败返回NULL,并设置error;

例如:IP地址:010aa8c0,转换为点分十进制:

01->1  0a->10 a8->168 c0->192;

由于网络的IP地址是高端模式,所以转换为192.168.10.1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505741.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV基础(三)】Ubuntu系统下EasyPR环境配置

环境配置 1、资源下载2、环境配置2.1、1、将EasyPR压缩包拷贝到Ubuntu 三种方法任选一种2.2、解压得到EasyPR文件夹(文件夹一层进入后EasyPR资源内容)2.3、终端命令修改权限**chmod -R 777 ./ EasyPR**2.4、查找EasyPR/include/easypr/config.h&#xff0c;使用gedit方式打开2.…

【yolov8部署实战】VS2019环境下使用C++和OpenCV环境部署yolo项目|含详细注释源码

一、前言 之前一阵子一直在做的就是怎么把yolo项目部署成c项目&#xff0c;因为项目需要嵌套进yolo模型跑算法。因为自己也是本科生小白一枚&#xff0c;基本上对这方面没有涉猎过&#xff0c;自己一个人从网上到处搜寻资料&#xff0c;写代码&#xff0c;调试&#xff0c;期间…

【机器学习】CIFAR-10数据集简介、下载方法(自动)

【机器学习】CIFAR-10数据集简介、下载方法(自动) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支…

SDN和SD-WAN的使用场景分别是什么?

软件定义网络&#xff08;SDN&#xff09;和软件定义广域网&#xff08;SD-WAN&#xff09;是两种创新的网络技术&#xff0c;它们在不同的使用场景中发挥着重要作用。本文将深入探讨SDN和SD-WAN 的使用场景&#xff0c;并比较它们的应用范围。 SDN的使用场景&#xff1a; 数据…

第四十八回 解珍解宝双越狱 孙立孙新大劫牢-Python模块和包概念与使用

吴用对宋江说&#xff0c;有个人&#xff0c;他是石勇的关系&#xff0c;与祝家庄的峦廷玉关系好&#xff0c;还是杨林、邓飞的老相识&#xff0c;他有一计.... 原来在宋江攻打祝家庄的时间段&#xff0c;山东海边登州也发生了一件事。登州山下有一家猎户&#xff0c;弟兄两个…

代码随想录算法刷题训练营day30:LeetCode(332)重新安排行程、LeetCode(51)n-皇后、LeetCode(37)解数独

代码随想录算法刷题训练营day30&#xff1a;LeetCode(332)重新安排行程、LeetCode(51)n-皇后、LeetCode(37)解数独 LeetCode(332)重新安排行程 题目 代码 //第二次刷题---在刷--高难度---注意超时---该代码照着代码随想录卡哥编写的代码写的&#xff0c;题目难度过大&#…

如何根据玩家数量和游戏需求选择最合适的服务器配置?

根据玩家数量和游戏需求选择最合适的服务器配置&#xff0c;首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏&#xff0c;如MMORPG或MOBA等&#xff0c;由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…

Django后端开发——cookies和session

文章目录 参考资料会话保持Cookiesviews.pyurls.py Sessionviews.pyurls.py Cookies和session对比 参考资料 B站网课&#xff1a;点击蓝色字体跳转 或复制链接至浏览器&#xff1a;https://www.bilibili.com/video/BV1vK4y1o7jH/?p29&spm_id_from333.1007.top_right_bar_…

LeetCode 2368.受限条件下可到达节点的数目:搜索 + 哈希表

【LetMeFly】2368.受限条件下可到达节点的数目&#xff1a;搜索 哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/reachable-nodes-with-restrictions/ 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给…

AG32 MCU 如何进入低功耗模式

默认情况下&#xff0c;微控制器(MCU)在系统复位或电源复位后处于运行模式。当CPU不需要持续运行时&#xff0c;可以使用几种低功耗模式来节省功耗。这是由用户选择的模式&#xff0c;给出了低功耗&#xff0c;短启动时间和可用的唤醒源之间的最佳妥协。 AG32VF 系列MCU具有以下…

使用docker部署es

直接安装运行es(会出现Linux系统卡死&#xff0c;下面有解决方案) [rootwq ~]# docker run -d --name elasticsearch -p 8020:9300 -e "discovery.typesingle-node" elasticsearch:7.6.2 Unable to find image elasticsearch:7.6.2 locally 7.6.2: Pulling from lib…

FreeRTOS学习笔记-基于STM32(1)基础知识

一、裸机与RTOS 我们使用的32板子是裸机&#xff0c;又称前后台系统。裸机有如下缺点&#xff1a; 1、实时性差。只能一步一步执行任务&#xff0c;比如在一个while循环中&#xff0c;要想执行上一个任务&#xff0c;就必须把下面的任务执行完&#xff0c;循环一遍后才能执行…