网络软件设计5

上传人:luoxia****01801 文档编号:75750929 上传时间:2019-02-01 格式:PPT 页数:17 大小:172.50KB
返回 下载 相关 举报
网络软件设计5_第1页
第1页 / 共17页
网络软件设计5_第2页
第2页 / 共17页
网络软件设计5_第3页
第3页 / 共17页
网络软件设计5_第4页
第4页 / 共17页
网络软件设计5_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《网络软件设计5》由会员分享,可在线阅读,更多相关《网络软件设计5(17页珍藏版)》请在金锄头文库上搜索。

1、网络软件设计,字节序和网络字节序,2,流程中的片断,填写端点地址结构 struct sockaddr_in addr; addr.sin_addr.S_un.S_addr = htonl(0x0a010203); addr.sin_port = htons(0x1234); 为什么要使用htonl,htons? 怎样在两个进程之间传递整数?,3,字节序问题的由来,关于整数的表达、存储和传输 表达 十进制: 4660 十六进制:0x1234 或 1234H 二进制: (00010010 00110100)2 整数表达中高字节在左边,低字节在右边,高字节,低字节,4,字节序问题的由来,整数的存储

2、0x1234,。,。,0,100,101,低地址,高地址,。,。,0,100,101,。,0x34,0x12,。,0,100,101,0x12,0x34,little endian,big endian,Moto,Intel,实验!,5,字节序问题的由来,传输! 都是从缓冲区的低地址开始,逐个字节发送,或逐个字节接收 无论软件设计,还是硬件设计,都遵循这个原则,发送算法 char *cp; cp = buffer; while( !empty) phy_send( *cp ); cp +; ,接收算法 char *cp, ch; cp = buf; while( !end) phy_recv(

3、 ch ) ; *(cp +) = ch ; ,。,。,0x12,0x34,0x12,0x34,0,buffer,6,字节序问题的由来,问题出现了! 发送的数据是: 接收的数据是:,。,。,。,。,0x12,0x34,0x12,0x34,0,0,Moto,Intel,7,字节序问题的解决方案1,方案一、在发送整数时,如果可以根据对方系统类型调整整数的发送顺序,。,。,。,。,0x12,0x34,0x12,0x34,0,0,little endian,big endian,方案二、在接收的时候,根据系统类型存放整数,。,。,。,。,0x12,0x34,0x12,0x34,0,0,即改变发送程序的

4、读取顺序,即改变接收程序的存放顺序,传输的顺序会变化,8,字节序问题的解决方案2,方案三、规定传输的顺序 互联网协议规定在传输整数时应该先传高字节网络字节序 规定传输顺序等于规定了缓冲区数据的放置顺序 传输程序操作缓冲区时,都是从低地址处理到高地址(发送接收同理),发送 char *cp; cp = buffer; while( !empty) link_send( *cp ); cp +; ,接收 char *cp, ch; cp = buffer; while( !empty) link_recv( ch ) ; *(cp +) = ch ; ,9,字节序问题的解决方案3,方案三:规定传输

5、的顺序 即规定用户程序向缓冲区中放置和取出数据的顺序高字节在前 用户程序、传输程序、缓冲区,。,。,0,用户程序,缓冲区,网络,传输程序(如TCP实体),系统,10,字节序问题的解决方案4,方案三、规定传输的顺序网络字节序 对Big endian系统(MOTO) 放置和取出的顺序不用改变 对Little endian系统(Intel) 放置和取出的顺序必须和普通情况下不同颠倒,。,0x12,0x34,。,。,0x12,0x34,。,Big Endian,Little Endian,0x12,0x34,网络序,主机序,网络序 主机序,11,字节序问题解决原则,小结 尽量少地对系统进行改变 传输程

6、序属于系统程序(TCP/IP协议栈) 改变都增加在用户一侧 改变传输时取放缓冲区的顺序系统的改变 改变传输前/后用户取放缓冲区的顺序用户的改变,。,。,0,用户程序,网络,传输程序,12,字节序问题的解决,用户将数据放置到缓冲区准备传输时:,char *cp; x = 0x1234; cp = buffer; *cp = (char)(x 8); *(cp + 1) = (char)x;,用户从接收缓冲区读取数据以使用时:,char *cp; int x; cp = buffer; x = *cp; x = x 8; x += *(cp + 1),(int *)cp =,x;,htons(x)

7、;,x = *(int *)cp;,ntohs(*(int *)cp);,htonl( );处理长整数,ntohl( );处理长整数,13,字节序的算法规定,1、由系统提供htonx( ), ntohx( )的实现 2、网络软件在任何时候需要向数据缓冲内存放(读取)整数时必须使用以上函数 3、不同的系统有不同的htonx( ), ntohx( )的实现方法 4、在以上基础上,用户网络软件不需再考虑字节序的不一致和程序移植问题,14,例,1、填入端点IP地址和端口号,struct sockaddr_in addr; addr. sin_addr.S_un.S_addr = htonl ( 0xc

8、a730c02 ); addr.sin_port = htons ( 0x1234 ); connect(s, ,202.115.12.2,2、从端点结构中读出IP地址和端口号,struct sockaddr_in remote; unsigned long ip_addr; int port; recvfrom( s, buf,len,0, ,15,点分十进制地址的使用1,ip地址本质为四个字节的长整数 从程序的角度理解 为方便程序员的使用,ip地址采用点分十进制的表达方式 计算机程序无法正确理解点分十进制表达方式 因为点分十进制其实是个字符串,202.115.12.2,0xca730c02

9、,16,点分十进制地址的使用2,将点分十进制ip地址填入端点地址结构时,需要转换为长整数 inet_addr( ); 实现点分十进制转换为整数的功能 从端点地址结构取出ip地址显示给用户看的时候要转换为字符串 inet_ntoa( ); 实现长整数转换为点分十进制字符串的功能 以上两个函数由系统调用 用户不用自己动手去变换 长整数为网络字节序,17,点分十进制地址的使用(例),unsigned long inet_addr (constant char *cp);,char * inet_ntoa ( IN_ADDR in);,1、填写端点地址结构,struct sockaddr_in addr; addr. sin_addr.S_un.S_addr = inet_addr(“202.115.12.2”);,2、显示ip地址,struct sockaddr_in addr; char* ipa_addr; ipa_addr = inet_ntoa( addr.sin_addr.S_un.S_addr ); printf( “ %s “, ipa_addr );,实验!,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械/制造/汽车 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号