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

为什么存在这两个东西:

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

  网络程序开发时 或是跨平台开发时 应该注意保证只用一种字节序 不然两方的解释不一样就会产生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);
        }
。。。。。。

  

时间: 2024-10-28 16:58:53

主机序和网络序以及使用例子的相关文章

主机字节序和网络字节序(大端序,小端序,网络序)

根据cpu的不同我们可以把主机字节序在内存中存储的顺序叫做主机序,也就是我们常说的,大端机和小端机.我们经常看到的有两种: 1.小端机(内存中以小端序存储的机器):将低字节序存储在开始的地址(及内存较小的内存) 2.大端机(内存中以大端序存储的机器):将高字节序存储在开始的的地址 举个例子:我们将内存从左到右排列:在内存中存放0x01020304              2000     2001    2002     2003 小 : 04             03         0

C++技术问题总结-第11篇 网络通信中主机序网络序

网络通信经常涉及到字节序转化,接下来理解主机序和网络序有什么异同. ①主机字节顺序HBO(Host Byte Order) 采用小头序(little-endian),从低到高的顺序存储. 低位字节排放在内存的低地址端,高位地址排放在高位地址端. ②网络字节顺序NBO(Network Byte Order) 采用大头序(big-endian),从高到低的顺序存储. 高位字节排放在内存的低地址端,低位地址排放在高位地址端. TCP/IP协议定义网络字节为big-endian. 举个例子,0x1234

网络序,主机序学习

网络序,主机序学习 网络序,主机序总是迷迷糊糊的.需要整理一下.千言万语,不如代码来的实在.哈哈,说干就干. #include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> int host_order() { unsigned long a = 0x12345678; unsigned char * p = (unsigned char *)(&a); printf("主机字节序:%0x %

[C++][转]CPU字节序 网络序 主机序 大端小端

原帖:http://www.cnblogs.com/darktime/p/3298075.html 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1. Little endian:将低序字节存储在起始地址2. Big endian:将高序字节存储在起始地址 LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也

主机字节序 和 网络字节序

不同的CPU有不同的字节序类型,这些字节序是指 整数 在内存中保存的顺序,这个叫做 主机序. 最常见的有两种: 1.Little endian:将低序字节存储在起始地址 2.Big endian:将高序字节存储在起始地址 LE little-endian(小端) 最符合人的思维的字节序: 地址低位存储值的低位: 地址高位存储值的高位: 怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说: 低位值小,就应该放在内存地址小的地方,也即内存地址低位: 反之,高位值就应该放在内存地址大的地方,也即

第五篇:主机字节序与网络字节序的转换

前言 我们知道,数据在主机内的存放有两种模式,也就是说,主机字节序有两种:大端和小端( 这里假定读者已经清楚这个问题 ).但在网络通信中,要求通信数据( 通信数据这里指IP号和端口号 )的使用必须用网络字节序.什么又是网络字节序? 网络字节序可以理解为主机字节序的大端模式.如果你的主机字节序原本就是大端模式,那么你可以考虑不用将通信数据转换为网络字节序:但如果你的主机字节序是小端,那么通信数据必须被下面提及到的其中某个函数进行处理,转换成网络字节序后方可使用( 即存放进套接字地址结构变量 ).

Python网络编程——主机字节序和网络字节序之间的相互转换

If you ever need to write a low-level network application, it may be necessary to handle the low-level data transmission over the wire between two machines. This operation requires some sort of conversion of data from the native host operating system

linux程序设计——主机字节序和网络字节序(第十五章)

15.2.10    主机字节序和网络字节序 当在基于intel处理器的linux机器上运行新版本的服务器和客户程序时,可以用netstat命令查看网络连接状况.它显示了客户/服务器连接正在等待关闭.连接将在一段超时间之后关闭,如下所示: 可以看到这条连接对应的服务器和客户的端口号.local address一栏显示的是服务器,而foreign address一栏显示的是远程客户(即使是在同一台机器上,它仍然是通过网络连接的).为了确保所有套接字都是不同的,这些客户端口一般都与服务器监听套接字不

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

为什么要转换? 主机字节序:整数在内存中保存的顺序,不同的处理器对应不容的模式 Little endian 将低序字节存储在起始地址 Big endian    将高序字节存储在起始地址 网络字节序:整数在网络中的发送顺序 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型.操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释. 网络字节顺序采用big endian排序方式 htons 本地的无符号short型主机字节序转换为网络字节序 htonl