1、背景

“端口号”或者“点分十进制的IP”必须先转化为“网络字节序”,才能在网络环境中传输。
TCP/IP 规定,网络数据流采用大端字节序:高地址存低位数据,计算机一般采用小端存储。如下图所示:

因此,从计算机到网络,需要一个“主机字节序”到“网络字节序”的转换。

2、转换函数

符号说明:
32:32 位,代表转IP ;
16:代表转端口号 ;
h:host 主机 ;
to:到;
n:net 网络 ;
l:长整形(标识 IP) ;
s:短整形(标识端口号)。

(1)端口号转换:

#include <arpa/inet.h> // 头文件
uint16_t htons(uint16_t hostshort); // 端口号 本地字节序转网络字节序
uint16_t ntohs(uint16_t netshort); // 端口号 网络字节序转本地字节序

(2)IP地址转换

uint32_t htonl(uint32_t hostlong); // IP 本地字节序转网络字节序
uint32_t ntohl(uint32_t netlong); // IP 网络字节序转本地字节序

但是,使用以上函数转换 IP 时候,应用起来比较麻烦,需要:先将点分十进制(字符串)转为unsigned int(本地字节序) 然后再利用上述函数转为网络字节序。
因此,一般只这样使用:

htonl(INADDR_ANY); // 将本地的任意有效的 IP转为网络字节序

彻底解决方式:常用以下函数进行转换 IP,这样可以实现:字符串直接转换为网络字节序

#include <arpa/inet.h> // 头文件
int inet_pton(int af, const char *src, void *dst); // 点分十进制直接转为网络字节序,成功返回0,失败返回-1

参数:
af:指定 IP 版本 :AF_INET为IPv4 、AF_INET6为IPv6
src:点分十进制的 IP 地址
dst:传出参数,获得的网络字节序,

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); // 网络字节序直接转点分十进制

参数:
src:网络字节序
dst:传出参数,点分十进制字符串的首地址
size:socklen_t 类型,字符串的长度

本地字节序和网络字节序的转换相关推荐

  1. 本地字节序和网络字节序

    本地字节序和网络字节序 字节序指不同的CPU访问内存中多字节数据的时候,存在大小端的问题,并且一定是访问多字节数据的时候才会存在大小端的问题,如果CPU访问的是字符串,则不存在大小端的问题: 那么如何 ...

  2. 本地字节序与网络字节序的相互转换(IP地址、端口号)

    一般数据在内存中是按照字节存储的,存储的方式分为大端和小端.在不知道对方主机的存储方式的情况下,我们不知道是否需要转换数据的存储方式.因此,TCP/IP协议规定:发送到网络的数据流应采用大端字节序! ...

  3. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs【转】

    (转自:https://blog.csdn.net/kulala082/article/details/53431473) Part 1: htons函数具体解释 在Linux和Windows网络编程 ...

  4. linux网络编程一:主机字节序与网络字节序的的判断

     linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...

  5. Linux---主机字节序与网络字节序

    现在的CPU累加器一次能够装载至少4个字节的一个整数,那么字节在内存中的排列顺序不同,导致累加器使用的结果不同,这就是字节序问题 . 例如: 我们存储一个int类型的数字:int a = 1; 主机字 ...

  6. 什么是字节序(端序、低端字节序、高端字节序、网络字节序)

    前言 一个内容为12(字符串)的文本文件,它的第一个字节是什么(小端序)?如果你的回答是0x32,那你真的应该好好理解下字节序了.如下图所示,我这里的正确答案是0x31.当然如果你的回答是不一定,这似 ...

  7. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs

    Part 1: htons函数具体解释      在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 i ...

  8. 【Linux】主机字节序和网络字节序

    (一)问题提出:为什么要有主机字节序和网络字节序的存在? 现在大多数PC机器都是小端字节序(小端存储),也称为主机字节序:但不排除有大端PC机器的存在. 若在两台字节序不同的主机上传输数据时,接收端将 ...

  9. 字节序 主机字节序与网络字节序互相转换

    目录 1.什么是字节序? 2.字节序分类 3.为什么要有大端字节序和小端字节序? 4.主机字节序和网络字节序 5.主机字节序与网络字节序的转换 6.怎么判断自己的主机是小端字节序还是大端字节序呢? 7 ...

最新文章

  1. Spring 的@Scheduled注解实现定时任务运行和调度
  2. Struts框架核心技术小小班
  3. python读取文件特定内容_python读取指定内存的内容
  4. 如果常数项没有经过显著性检验_Cg,Cgk 能代替偏倚显著性检验?
  5. STM32 之十六 深入了解 ADC 工作原理及参考电压变动的影响
  6. 简化得最没道理的6个汉字,让人大跌眼镜
  7. 深度优先遍历解决连通域求解问题-python实现
  8. Tideways+Xhgui搭建非侵入式php监控平台
  9. prettytensor 的使用
  10. 实战:基于服务端开发和前后端分离开发区别
  11. python3.8下载request_python3 requests 安装包下载安装[windows]
  12. 变分模态分解python代码_VMD变分模态分解代码问题
  13. 联想x3850x6重装系统,ibm x3850 x6安装系统,2015ibm服务器x3850x6
  14. Dell uefi使用U盘重装系统
  15. 网桥算法的源代码c语言版,透明网桥算法(C语言)
  16. win10如何删除输入法_win10如何添加和删除输入法_win10系统添加和删除输入法的图文教程...
  17. 关于刚毕业的程序员考取mba
  18. 计算机到点就有音乐怎么清除缓存垃圾,QQ音乐缓存文件在哪 QQ音乐缓存清理方法-电脑教程...
  19. walsh64码 matlab,实验7 Walsh码及单用户CDMA系统直接序列扩频仿真
  20. linux Fedora安装桌面,在Fedora Linux上安装Elementary OS桌面的方法

热门文章

  1. Piper Sandler为Heubach和SK Capital收购科莱恩颜料业务提供咨询服务
  2. Java基础---Markdown基本语法和常用dos命令
  3. Win10 安装Office 2016出现错误代码30204-44怎么处理?
  4. Android Room数据实验案例
  5. POST请求数据量过大,后端请求获取参数为null
  6. gradle批量配置productFlavors(渠道)
  7. java中super()什么意思_java中Super到底是什么意思?必须举例说明!
  8. EasyHook Creating a remote file monitor
  9. 玩家端游经常掉线怎么办
  10. 浅谈Android项目中的build.gradle文件