您的位置:首页 > 理论基础 > 计算机网络

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

2016-09-04 15:56 411 查看
为什么存在这两个东西:

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

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


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐