关于htonl函数
,今天翻书看到在客户端和服务器端都用这个函数,知道是把主机字节转换为网络字节,可是转换的不是主机的IP地址和端口号么,跟要传输的数据好像没什么关系,而且,要接收的一方不需...
,今天翻书看到在客户端和服务器端都用这个函数,知道是把主机字节转换为网络字节,可是转换的不是主机的IP地址和端口号么,跟要传输的数据好像没什么关系,而且,要接收的一方不需要把网络字节转换为主机字节么?
补充下,说的清楚点:htonl这个函数只是把主机的IP地址和端口号转换成网络字节顺序,而不是把要发的数据转换成网络字节顺序,那要发送的数据不是没变么 展开
补充下,说的清楚点:htonl这个函数只是把主机的IP地址和端口号转换成网络字节顺序,而不是把要发的数据转换成网络字节顺序,那要发送的数据不是没变么 展开
3个回答
展开全部
这个是个字节序转换函数,具体的比较多,我就摘抄了,反正是一个转换而已,不是简单的转为网络字节,主要是因为主机字和网络字,字序不同~
htonl就是把本机字节顺序转化为网络字节顺序
所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
先举个例子:
int a = 0x403214;
int b = htonl(a);
我在VC++6.0调试这段代码,发现
&a的值为:0x0012ff44
其中0x0012ff44、0x0012ff45、0x0012ff46、0x0012ff47这四个单元的值依次为:14、32、40、00,即0x403214这个数的高位部分存放在高位地址中,低位部分存放在低位地址中,即小尾顺序。
&b的值为:0x0012ff40
其中0x0012ff40、0x0012ff41、0x0012ff42、0x0012ff43这四个单元的值依次为:00、40、32、14,即把原数0x403214的高位部分存放在低位地址中,低位部分存放在高位地址中。
由此可见,如果一个数以小尾顺序存储,经htonl函数调用后这个数的高地位字节会完全颠倒过来成为一个新的数。这个新的数在机器内部其实还是以小尾顺序存储的,但是相对于原来的数而言相当于是变成大尾顺序的了。
long型的0x40写完整为:0x 00 00 00 40,共四个字节,调用htonl后四个字节颠倒顺序,为0x 40 00 00 00。
同样,0x40 00 00 00调用htonl后变为0x 00 00 00 40,即0x40
htonl就是把本机字节顺序转化为网络字节顺序
所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
先举个例子:
int a = 0x403214;
int b = htonl(a);
我在VC++6.0调试这段代码,发现
&a的值为:0x0012ff44
其中0x0012ff44、0x0012ff45、0x0012ff46、0x0012ff47这四个单元的值依次为:14、32、40、00,即0x403214这个数的高位部分存放在高位地址中,低位部分存放在低位地址中,即小尾顺序。
&b的值为:0x0012ff40
其中0x0012ff40、0x0012ff41、0x0012ff42、0x0012ff43这四个单元的值依次为:00、40、32、14,即把原数0x403214的高位部分存放在低位地址中,低位部分存放在高位地址中。
由此可见,如果一个数以小尾顺序存储,经htonl函数调用后这个数的高地位字节会完全颠倒过来成为一个新的数。这个新的数在机器内部其实还是以小尾顺序存储的,但是相对于原来的数而言相当于是变成大尾顺序的了。
long型的0x40写完整为:0x 00 00 00 40,共四个字节,调用htonl后四个字节颠倒顺序,为0x 40 00 00 00。
同样,0x40 00 00 00调用htonl后变为0x 00 00 00 40,即0x40
追问
没回答道点上。我知道这个函数的作用,就是卡在中间了,没搞明白这个函数就是对IP地址和端口号进行转换,这和要传输的数据有什么关系
追答
这玩意转的就是排序序列,不同操作机的排序方法大排序的读取字节序列方式不同,这个可以去查一查主机字节顺序和网络字节顺序,主要区别也就是起始地址存的是低序还是高序,不同的方式读取的顺序也不同,因此如果使用高序方法去读取低序字节,获取出的数据就不是需要的数据,(因为基本上读取反掉了),所以需要经过转换,这个函数是只针对IP和端口的,因为从网络上来的一般是高字节序,要经过这个函数转为本机序,才能保证获取到的IP和端口是正确的
展开全部
这个其实跟API的规范有关系 socket编程的API是加州伯克利大学的人写的 后来有人移植到windows等各种平台上
因为Windows和linux上存储整数的方法不同,所以在调用socket函数时 凡是涉及整数在网上传时或者调用API时,使用的整数都要调用这个函数转一下,当然接收到的人也要转回来 所以ip和端口还有网上传的整数都要转(但是字符串不用转)
就好象各个网络上传递的是英语,有的人说中文,有的人说英语,有的人说日语,怎么办,大家传送上网的时候转成英语,从网上读取的数据又从英语转成自己的语言
发送的数据也要转 只不过如果 你两个机器都是一样的操作系统 那么 转不转都不会出错
如果操作系统不一样 那可能有问题 比如win 32 和win 64
因为Windows和linux上存储整数的方法不同,所以在调用socket函数时 凡是涉及整数在网上传时或者调用API时,使用的整数都要调用这个函数转一下,当然接收到的人也要转回来 所以ip和端口还有网上传的整数都要转(但是字符串不用转)
就好象各个网络上传递的是英语,有的人说中文,有的人说英语,有的人说日语,怎么办,大家传送上网的时候转成英语,从网上读取的数据又从英语转成自己的语言
发送的数据也要转 只不过如果 你两个机器都是一样的操作系统 那么 转不转都不会出错
如果操作系统不一样 那可能有问题 比如win 32 和win 64
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数据是字符串,由char组成,单字节,不需要转换。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询