网络字节序与主机字节序的转换 - HEN_MAN的专栏 - 博客频道 - CSDN.NET
网络字节序与主机字节序的转换 - HEN_MAN的专栏 - 博客频道 - CSDN.NET
网络字节序与主机字节序的转换
分类: 网络编程 2011-12-18 14:52 89人阅读 评论(0) 收藏 举报在对IP地址结构体SOCKADDR_IN赋值的时候,经常会用到下列的函数htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa。查看这些函数的解析,会发现这些函数其实是与主机字节序和网络字节序之间转换有关。就是什么网络字节序,什么是主机字节序呢?下面我写出他们之间的转换:
用IP地址127.0.0.1为例:
第一步 127 . 0 . 0 . 1 把IP地址每一部分转换为8位的二进制数。
第二步 01111111 00000000 00000000 00000001 = 2130706433 (主机字节序)
然后把上面的四部分二进制数从右往左按部分重新排列,那就变为:
第三步 00000001 00000000 00000000 01111111 = 16777343 (网络字节序)
然后解析上面提到的函数作用就简单多了,看以下代码:
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(2130706433);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);先是定义了一个IP地址结构体addrSrv,然后初始化它的IP时addrSrv.sin_addr.S_un.S_addr必须是赋值IP地址的网络字节序,htonl函数的作用是把一个主机字节序转换为网络字节序,也就是上面转换过程中第二步转换为第三步的作用,127.0.0.1的主机字节序是2130706433,把主机字节序2130706433转换为网络字节序就是htonl(2130706433)=16777343,所以如果你知道网络字节序是16777343的话,addrSrv.sin_addr.S_un.S_addr=htonl(2130706433);与addrSrv.sin_addr.S_un.S_addr=16777343;是完全一样的。
addrSrv.sin_addr.S_un.S_addr=htonl(2130706433);这句还可以写为:
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 结果是完全一样的。
可见inet_addr函数的转换作用就是上面的第一步到第三步的转换。
下面再看端口的主机字节序与网络字节序的转换。以6000端口为例。
第一步 00010111 01110000 = 6000 (主机字节序)
端口号其实就已经是主机字节序了,首先要把端口号写为16位的二进制数,分前8位和后8位。
第二步 01110000 00010111 = 28695 (网络字节序)
然后把主机字节序的前八位与后八位调换位置组成新的16位二进制数,这新的16位二进制数就是网络字节序的二进制表示了。
因此,如果你知道6000端口的网络字节序是28695的话。 addrSrv.sin_port=htons(6000);可以直接写为 addrSrv.sin_port=28695;结果是一样的,htons的作用就是把端口号主机字节序转换为网络字节序。
与htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa,不难看出,ntohl,ntohs,inet_ntoa,这三个函数其实就是执行与他们相对应函数的相反转换,在这里就不详细解析了。
转载声明: 本文转自 http://hi.baidu.com/feng411215/blog/item/c61764340161c8365ab5f521.html (百度空间)
===================================================================
字节序问题--大端法小端法
http://hi.baidu.com/tanchunhai/blog/item/bf02d758dcce1687800a1893.html
字节序(Endian),大端(Big-Endian),小端(Little-Endian)
http://www.cppblog.com/tx7do/archive/2009/01/06/71276.html
API SOCKET基础
(一) TCP建立连接并通信
http://hi.baidu.com/feng411215/blog/item/95eb6b7f66c5cc0529388a52.html
(二) UDP通信
http://hi.baidu.com/feng411215/blog/item/b423e4d369eb8a39960a165b.html
(三) 网络字节序与主机字节序的转换
http://hi.baidu.com/feng411215/blog/item/c61764340161c8365ab5f521.html
(四) TCP SOCKET recv的内存情况
http://hi.baidu.com/feng411215/blog/item/58adba039583657a3912bb3e.html
(五) 异步套接字
http://hi.baidu.com/feng411215/blog/item/7f1f034a3ab58a2e09f7ef38.html
(六) CAsyncSocket 与 CSocket
http://hi.baidu.com/feng411215/blog/item/bf5391c4e9f54dc639db491e.html
转载于:https://www.cnblogs.com/lexus/archive/2012/12/27/2836109.html
网络字节序与主机字节序的转换 - HEN_MAN的专栏 - 博客频道 - CSDN.NET相关推荐
- linux网络编程一:主机字节序与网络字节序的的判断
linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...
- php 字节序,Linux_Linux中网络字节序和主机字节序,主机字节序就是我们平常说的 - phpStudy...
Linux中网络字节序和主机字节序 主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序.Big-Endian和Littl ...
- java 网络字节序转主机字节序_C语言高级编程——网络编程技术
了解什么是网络编程 熟悉七层网络模型 熟悉网络开发中使用到的函数 掌握TCP协议类程序开发 掌握UDP协议类程序开发 计算机本身是不会进行网络通信的,所以要想使通过软件进行网络通信,必须制定相应的规则 ...
- C#之网络字节序与主机字节序互转
主机字节序转网络字节序 //加上两个字节长度,再发送byte[] bSend = new byte[buffer.Length + 2]; byte[] bLenth = BitConverter.G ...
- 网络字节序与主机字节序的相互转换
1.网络字节序与主机字节序 在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换.说到网络字节序与主机字节序需要清晰了解以下几个概念. 字节序,顾名思义,指字节在内存中存储的顺序.比如一个 ...
- 网络字节序和主机字节序
网络字节序说明 TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.例如上一节的UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地 ...
- 网络字节序和主机字节序互转
1.网络字节序转为主机字节序 //网络字节序转为主机字节序 uint64_t utils::Ntohll(uint64_t val) {if (__BYTE_ORDER == __LITTLE_END ...
- java转网络字节序_【转】网络字节序与主机字节序
最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序 ...
- 【转】大端模式与小端模式、网络字节顺序与主机字节顺序 (经典)
大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: ...
- 大端模式、小端模式、网络字节顺序与主机字节顺序
大端模式.小端模式.网络字节顺序与主机字节顺序 大端模式与小端模式 概念与详解 在各种体系的计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端 ...
最新文章
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②...
- mysql global index_CHECK GLOBAL INDEX
- 查看dev下设备名的含义
- Excel 技术篇-解决“单元格不能自动适应大小“问题
- python金字塔图绘制_如何用R或Python绘制3d(4变量)三元(金字塔)图?
- 活跃在海底隧道的铁路“小蓝人”
- FireFox如何使用扩展
- 数据中心 服务器管理规范,互联网技术详解 | 新时代数据中心管理标准Redfish
- IE浏览器GET请求中文乱码
- ds18b20 c语言代码,读DS18B20序列号(c语言)
- win7/ubuntu18 双系统安装和卸载
- win10 获取超级管理员权限,administrator不是最高权限解决办法
- 杨忠国老师专家点评:全球5G手机销量榜出炉
- 使用Python获取DNS记录
- python爬取海量精美高清漂酿纯真可爱善良小姐姐壁纸(老司机福利)
- 黄鸟抓包app(httpcanary)
- 12 Roll A Ball全部代码
- 洛谷 最大食物链计数 python题解
- 图像质量的主客观评价准则
- 解决idea编译提示: Error:(4, 28) java: 程序包com.xxx.xxx不存在 问题
热门文章
- 运放TL08系列,功放LM386,8欧姆的扬声器
- 基于Python网易云音乐歌词爬取
- 一点计算机电脑就闪,电脑启动有点闪烁是怎么回事
- The server encountered an internal error () that prevented it from fulfilling this request
- 微生物组-扩增子16S分析第10期(线上/线下同时开课,本年最后一期)
- 移动端可以查看的设计APP,推荐给大家
- 各个音阶的频率_c大调音阶各个音的频率(赫兹)是多少答得好给分
- Windows注册表命令(最简单明了)
- 微软 office 服务器 部署,部署 Office Online Server
- python发送邮件发件人_在python电子邮件的from字段中添加发件人的名称