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

为什么存在这两个东西:

    空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字 节序转换为主机字节序

  网络程序开发时 或是跨平台开发时 应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug

主机序:

  不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序

  1. Little endian:将低序字节存储在起始地址 
  2. Big endian:将高序字节存储在起始地址 

      LE little-endian 
    最符合人的思维的字节序 
    地址低位存储值的低位 
    地址高位存储值的高位 
    怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说 
    低位值小,就应该放在内存地址小的地方,也即内存地址低位 
    反之,高位值就应该放在内存地址大的地方,也即内存地址高位 

      BE big-endian 
    最直观的字节序 
    地址低位存储值的高位 
    地址高位存储值的低位 
    为什么说直观,不要考虑对应关系 
    只需要把内存地址从左到右按照由低到高的顺序写出 
    把值按照通常的高位到低位的顺序写出 
    两者对照,一个字节一个字节的填充进去

网络序:

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

常用的转换函数:

  htons ntohs htonl ntohl (s 就是short l是long h是host n是network)

例子

。。。。。。
        struct sockaddr_in   client,server;
        char    buf[MAX_LEN];
        char flag[MAX_LEN];
        FILE    *fq_send=NULL,*fq_rec=NULL;
        int     len,opt = 1;
 
        if( ( sd = socket(AF_INET,SOCK_STREAM,0)) == -1 )
        {
                perror("socket");
                exit(1);
        }
        bzero(&server,sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(SER_PORT);//将端口号的主机序转为网络序
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
        if( connect(sd,(struct sockaddr *)&server,sizeof(server)) < 0 )
        {
                perror("Connect");
                close(sd);
                exit(1);
        }            
。。。。。。

 

  

posted @ 2016-09-04 15:56  风雨缠舟  阅读(3529)  评论(0编辑  收藏  举报