说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

刚开始学习WinSocket ,对一些基础知识不太理解,请指点

编辑:说三道四文库 发布时间:2018-05-27 08:07
HTML文档下载 WORD文档下载 PDF文档下载
htonl()、ntohl()这两个函数我不清楚,
书上说:
htonl函数是把主机字节顺序转换成网络字节顺序。
主机字节顺序、网络字节顺序各是什么意思?
谢谢
inter86处理器上,用“小头”形式来表示多字节编号,字节的排序是从最无意义的字节到最有意义的字节,在计算机中把ip地址和端口号指定成多字节数时,这个数就按“主机字节”顺序来表示,但是如果在网络上指定ip地址和端口号,必须用“大头”顺序来表示,从最有意义的字节到最无意义的字节,一般称为网络字节顺序
是指数据流中以每八位为一单位(Octet)的排列顺序。本机的数据存储方式有所谓Big-endian和Little-endian之分,即多字节中高字节与低字节的存储顺序如何安排,可能与TCP/IP规定的不一样,所以用这两个函数来调整。
请举个例子:
202.111.121.011   这个ip地址是不是就是网络字节顺序?
网络中除了TCP\IP之外,还有很多的协议,他们各有各的主机字节顺序,所以为了让数据在网络上流通,被使用各种协议的机子认到,所以要转换成每台机子都认得到的网络字节顺序。然后本地机再转换成符合自己机子协议的主机字节顺序。
202。111。121。011是主机字节顺序。而且要用inet_addr才能转换成网络字节顺序
《windows网络编程技术》中讲到:
“inter86处理器上,用“小头”形式来表示多字节编号,字节的排序是从最无意义的字节到最有意义的字节,在计算机中把ip地址和端口号指定成多字节数时,这个数就按“主机字节”顺序来表示,但是如果在网络上指定ip地址和端口号,"互连网联网标准"指定多字节值必须用“大头”顺序来表示,从最有意义的字节到最无意义的字节,一般称为网络字节顺序 。”

请问其中的“大头、小头”形式是什么样子的?请举例。
请举各主机字节转换到网络字节顺序的例子,谢谢
再加30分
please
please
?
?
   不同的型号的机子有时会用不同的字节顺序存储数据。例如,Intel机器和
Macintosh(摩托罗拉)机器就用相反的顺序存储数据。Inter的字节顺序成为
"little-Endian(小头)",反之Macintosh用的字节顺序成为"big-Endian(大头)".

   小头顺序指最有意义的字节方在最左边,而大头顺序指最有意义的字节方在最右边。
   主机字节顺序是"小头",网络字节顺序是"大头"。

   因此"172.18.196.52"是个主机字节顺序,因为172是用来区分IP地址的类别的,显然
是最有意义的,但"172.18.196.52"还不能用htonl函数来转换,因为它只是个字符串,
要用inet_addr()来转换成网络字节顺序。

    在下面两种情况下,你发数据时,必须将主机字节顺序转换成网络字节顺序:
    (1)你传送的数据是端口号或IP地址
    (2)如果你将要通信的服务器软件不是用MFC做的(并且你没有它的原代码),而
         这两台机器又用不同的字节顺序
    
谢谢 caiyi9000(翼翼) 

请问: 
我ping了sohu的主机,显示 :   61.135.131.6 
这里显示的是不是网络字节吧?
那转换成主机字节是多少?
我在ie中敲击我   61.135.131.6    就可以访问sohu.

其实他是个主机字节,传到网络中,就改变成了网络字节了。对不对?
我在本机中用主机字节就可以转成网络字节吗
操作系统实现Ping命令,以及IE在发送HTTP请求建立连接时,已经为你实现了转换。
比如,

const char* pIp="192.168.1.6";

unsigned long ulIP = inet_addr(pIP);//ulIP是主机序

unsigned long ulIP_network = htonl(ulIP);//这里ulIP_network就是网络序

char* pcHost=NULL;
pcHost=inet_ntoa(ulIP_network);//得到的pchost所指向的“6.1.168.192”

pcHost = inet_ntoa(ulIP); //这里,pcHost指向“192.168.1.6"

懂了吗?
谢谢你们的解答,下面是我的理解:

    例如: sohu :  61.135.131.6

const char* Ip="61.135.131.6";  //字符串(主机顺序)必须用inet_addr来转换为网络字节顺序
   unsigned long ulIP =inet_addr(Ip);//ulIP现在是网络字节顺序

运行后:
   Ip:   0x004153f0
     ulIP:    109283133

************

   u_long a=1212;         //端口为1212 ,数字(主机顺序)应该用htonl转换为网络字节顺序
unsigned long b = htonl(a);//这里b就是网络序

运行后:
    a:        1212
    b:        3154378752       //端口号为1212的网络顺序的表示形式

inet_addr 和 htonl 的功能是一样的,都是把参数由主机顺序转换为网络字节顺序,不同的是所对应的参数不同。一个是转换字符传,一个是数字。   (同理,网络顺序转换成主机顺序也是用另外两个相对应得函数)

是不是一般情况下,写程序,因为网络联系需要ip和端口号,所以程序同时都要用到这两个函数?  
我的理解对吗?  
ask
please
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘