请问 网络编程里的主机字节顺序和网路字节概念?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问 网络编程里的主机字节顺序和网路字节概念?相关的知识,希望对你有一定的参考价值。

参考技术A 网络字节序是大端存储方式 ,也就是高字节存在其实地址
这是数数据 0x 01 02 03 04
这是内存地址 4000 4001 4002 4003
反过来就是小端存储方式。

而本机字节序和具体的主机有关,有的机器的本机字节序采用大端,有的采用小端

在网络编程进行数据传输时 一般用 htonl 宏将本机序装换成网络序
另外如果本机使用大端存储,那么这个htonl 宏就被置为空,所以不会改变顺序

全部是本人手打,欢迎指正本回答被提问者采纳
参考技术B

主机字节序和网络字节序转换

为什么要转换?

主机字节序:整数在内存中保存的顺序,不同的处理器对应不容的模式

Little endian 将低序字节存储在起始地址

Big endian    将高序字节存储在起始地址

 

网络字节序:整数在网络中的发送顺序

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。

网络字节顺序采用big endian排序方式

 

htons 本地的无符号short型主机字节序转换为网络字节序

htonl     本地的无符号long型主机字节序转化为网络字节序

ntohs    网络字节序转换为本地的无符号short型主机字节序

ntohl     网络字节序转换为 本地的无符号long型主机字节序

inet_addr: 将一个点间隔地址转换成  struct in_addr

inet_ntoa: 将网络字节序格式IP转换到字符串

inet_aton: 将字符串转换到网络字节序格式IP

inet_pton: 将点十分进制转换为网络字节序

atoi: 将字符串转换为整型数

在使用little endian的系统中      这些函数会把字节序进行转换 
在使用big endian类型的系统中 这些函数会定义成空宏

 

参考  http://blog.csdn.net/suwei19870312/article/details/5320831

  http://www.360doc.com/content/12/0222/10/54470_188560773.shtml

 

函数使用需要注意的问题:

IPv4套接口地址数据结构

结构:

    struct sockaddr_in {

     short int sin_family;     //IPV4协议为AF_INET

     unsigned short int sin_port;   //16位端口号,网络字节序列

     struct in_addr sin_addr; 

   unsigned char sin_zero[8];    //备用域,为了和struct sockaddr字节数保持相同;

  };

    struct in_addr{

       in_addr_t       s_addr;//32位IP地址,网络字节序列

} ;

参考 https://my.oschina.net/SBaof/blog/477585

以上是关于请问 网络编程里的主机字节顺序和网路字节概念?的主要内容,如果未能解决你的问题,请参考以下文章

主机字节序和网络字节序转换

大端模式与小端模式网络字节顺序与主机字节顺序

主机序和网络序以及使用例子

主机字节序 与 网络字节序

网络与主机字节转换函数:htons ntohs htonl ntohl

网路概念分类