目前的通信方式趋于多样化,手机和电脑的qq通信等异构通信(计算机软件(操作系统)、计算机硬件)、内核体系结构、ARM、x86 )不同)也很普遍
另外,计算机设计之初,对存储器内数据的处理方法也不同。 (下游地址包含下游数据或下游地址包含上游数据),但正在通信)对于ISO/OSI和TCP/IP层模型,数据进一步封装(然后添加至报头)并添加至目标段
综上所述,数据传输的过程,一定有一个标准化的过程。 即,从主机a到主机b通信
的固有数据存储库-----标准化-----向固有格式的转换
如上所述,a或b的唯一数据存储格式是它自己的主机字节序,以及上述标准化是网络字节序(即大字节序)
的主机字节序--------网络字节序--------的主机字节序
主机字节序:
在自己的主机内部。 内存中数据的处理方法分为以下两种。
大字节序(big-endian )根据内存的增长方向,高位数据存储在低位内存中
小端序(little-endian )根据内存的增长方向,高位数据存储在低位存储器中
但是,你怎么知道我们的主机就是那样的? 这可以通过程序进行验证:
span style='font-size:18px;' # include stdio.h # include arpa/inet.hint main () { unsigned long a=0x12345678; 无符号char * p=(无符号char * ) ) a; 打印(主机字节顺序: %0x %0x %0x %0x (0x (n ),p[0],p[1],p[2],p[3] ); 未注册的long b=htonl (a; //将主机端序转换为网络端序p=(unsignedchar* ) ) b ); printf (按网络字节顺序: %0x %0x %0x %0x (0x (n ),p[0],p[1],p[2],p[3] ); 返回0; (} /span的执行结果:
目前的主机是小端序
:关于htonl
span style='font-size:18px;' # include arpa/inet.Hu int 32 _ t htonl (uint 32 _ t hostlong ); uint 16 _ th tons (uint 16 _ t hostshort; uint32_tntohl(uint32_tnetlong; uint16_tntohs(uint16_tnetshort ); /span
h是主机host,n是网络net,l是长整形长,s是短整形短,所以上述函数还可以很好地理解
span style='font-size:18px;' # include stdio.h # include arpa/inet.hint main ({ struct in _ addr IP addr; unsigned long addr=inet _ addr (192.168.1.100 ); printf(addr=%u(n ),ntohl ) ) addr ); ipaddr.s_addr=addr; printf(%s(n ),inet_ntoa ) IPaddr ); 返回0; (} /span的执行结果:
值得注意的是:
in _ addr _ ininet _ addr (const char * strptr );
inet_addr参数是以点分隔的十进制字符串,返回的值是32位二进制网络字节序的IPv4地址。 否则,为INADDR_NONE
返回值为in_addr_t:IPv4,通常为uint32_t
因此,也可以定义为无符号龙
char * inet _ ntoa (struct in _ addrinaddr );
因为参数是结构,所以要调用它,必须首先定义结构。