在对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
分享到:
相关推荐
利用宏将网络字节序和主机字节序ip格式化输出为字符串ip
IP、主机字节序、网络字节序、互转 ------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using ...
在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用c++和python语言,如何实现主机...
项目中需要64位数的字节序转换,主机序转换成网路序或者相反转换,写了2个函数,有需要的可以参考。
大小端字节序的介绍和相互转换。在c++中,有4个函数可以实现主机字节序到网络字节序的相互转换。
网络中表示的IP地址与主机表示不同,本程序通过转换来表示。
尾数 一个小的golang库,可帮助处理主机到网络和网络到主机的字节序转换免责声明在使用此库之前,请阅读并了解Rob Pike的有关的博客文章。 长话短说,每当您需要担心代码是在小型字节序还是大型字节序计算机上运行时...
网络字节顺序和主机字节顺序的转换 通过这篇文章你会知道什么就小尾方式和大尾 方式 网络字节顺序其实就是大尾方式,intel系统一般是小尾 方式
一、 基本知识 主机字节序和网络字节序 主机字节序即内存中存储字节的方法有: 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序...uint32_t ntohl(uint32_t 位的网络字节序>) //转换为主机字节序
linux点分十进制IP转换为long型 网络字节序与主机字节序互转
资源为32位机下高低位字节交换类,适用于c++语法下的环境,一般跨平台通讯程序时,涉及主机字节不一致情况,如Linux下的服务程序和windows下客户端程序通讯时,有可能需要做主机字节高低位交换,本类提供int、float...
把32位正整数从网络序转换成主机字节序。 socket.ntohs(x) // 类似于C语言的ntohs(x) 把16位正整数从网络序转换成主机字节序。 socket.htonl(x) // 类似于C语言的htonl(x) 把32位正整数从主机字节序转换成网络序...
描述了IP地址格式转换的常用接口,主机字节序和网络字节序相互转换,Ip字符串转换成long型数值;高字节序和低字节序的名词解释
##第一章1.6主机字节序和网络字节序之间相互转换import socket#主机字节序和网络字节序之间相互转换def convert_integer( integer ):'''主机字节序和网络字节序之间的转换'''long_host_byte = socket.ntohl( integer...
IP地址主机字节顺序,网络字节顺序,点分十进制互转
获取客户端IP 将IPv4地址转换成字节 获取主机名 从多级反向代理中获得第一个非unknown IP地址 检测参数是否在ip通配符里 校验ip是否符合过滤串规则
5.4 主机字节序和网络字节序 163 5.4.1 字节序的含义 164 5.4.2 网络字节序的转换 164 5.5 小结 166 第6章 应用层网络服务程序简介 167 6.1 HTTP协议和服务 167 6.1.1 HTTP协议概述 167 6.1.2 HTTP...
(4)将取“反”后的子网掩码与IP地址做“与”运算,将答案化为十进制便得到主机地址。 通过上面的一段大家应该有所了解了,如果还不太明白可勾选“示范”来查看。 我把上面操作的各个模块都独立出来而不是一步求出...
将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象...
Host byte order to network byte order.doc(主机字节顺序转换成网络字节顺序)