嵌入式网络编程精.ppt

上传人:石*** 文档编号:50061946 上传时间:2022-10-12 格式:PPT 页数:27 大小:1.66MB
返回 下载 相关 举报
嵌入式网络编程精.ppt_第1页
第1页 / 共27页
嵌入式网络编程精.ppt_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《嵌入式网络编程精.ppt》由会员分享,可在线阅读,更多相关《嵌入式网络编程精.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、嵌入式网络编程嵌入式网络编程第1页,本讲稿共27页8.1 8.1 字节序字节序字节序是由于不同的主处理器和操作系统对大于一个字字节序是由于不同的主处理器和操作系统对大于一个字节的变量在内存中的存放顺序不同而产生的,例如两个字节节的变量在内存中的存放顺序不同而产生的,例如两个字节的的short int和四个字节的和四个字节的int类型变量都有字节序的问题。字类型变量都有字节序的问题。字节序通常有大端字节序和小端字节序的两种分类方法。节序通常有大端字节序和小端字节序的两种分类方法。第2页,本讲稿共27页8.1.1 8.1.1 大端字节序和小端字节序大端字节序和小端字节序字节序是由于字节序是由于CP

2、U和和OS对多字节变量的内存存储顺序对多字节变量的内存存储顺序不同而产生的。不同而产生的。1字节序介绍字节序介绍2字节序的例子字节序的例子第3页,本讲稿共27页8.1.2 8.1.2 字节序转换函数字节序转换函数由于主机的千差万别,主机的字节序不能做到统一,但由于主机的千差万别,主机的字节序不能做到统一,但是对于网络上传输的变量,它们的值必须有一个统一的表示是对于网络上传输的变量,它们的值必须有一个统一的表示方法。网络字节序是指多字节变量在网络传输时的表示方法,方法。网络字节序是指多字节变量在网络传输时的表示方法,网络字节序采用高端字节序的表示方法。这样小端字节序的网络字节序采用高端字节序的表

3、示方法。这样小端字节序的系统通过网络传输变量的时候需要进行字节序的转换,大端系统通过网络传输变量的时候需要进行字节序的转换,大端字节序的变量则不需要进行转换。字节序的变量则不需要进行转换。1字节序转换函数介绍字节序转换函数介绍2字节序转换的方法字节序转换的方法第4页,本讲稿共27页8.1.2 8.1.2 字节序转换函数字节序转换函数第5页,本讲稿共27页8.1.2 8.1.2 字节序转换函数字节序转换函数第6页,本讲稿共27页8.1.3 8.1.3 一个字节序转换的例子一个字节序转换的例子下面的例子是对下面的例子是对16位数值和位数值和32位数值进行字节序转换,位数值进行字节序转换,每种类型的

4、数值进行两次转换,最后打印结果。每种类型的数值进行两次转换,最后打印结果。116位字节序转换结构位字节序转换结构232位字节序转换结构位字节序转换结构3变量值打印函数变量值打印函数showvalue4主函数主函数main516位值位值0 xabcd的二次转换的二次转换632位值位值0 x12345678的二次转换的二次转换7结果打印结果打印8编译运行程序编译运行程序第7页,本讲稿共27页8.2 8.2 字符串字符串IPIP地址和二进制地址和二进制IPIP地址的转换地址的转换人们可以理解的人们可以理解的IP地址表达方式是类似地址表达方式是类似“127.0.0.1”这样的字符串;而计算机理解的则是

5、像这样的字符串;而计算机理解的则是像0 x01111111000000000000000000000001(127.0.0.1)这)这样表达的样表达的IP地址方式。在网络程序的设计中,经常需要进行地址方式。在网络程序的设计中,经常需要进行字符串表达方式的字符串表达方式的IP地址和二进制的地址和二进制的IP地址之间的转换,本地址之间的转换,本节对此类函数进行介绍。节对此类函数进行介绍。第8页,本讲稿共27页8.2.1 inet_xxx()8.2.1 inet_xxx()函数函数Linux操作系统有一组函数用于网络地址的字符串形式操作系统有一组函数用于网络地址的字符串形式和二进制形式之间的转换,其

6、形式为和二进制形式之间的转换,其形式为inet_xxx()。函数的原。函数的原型如下:型如下:#include#include#include 1函数函数inet_aton()2函数函数inet_addr()3函数函数inet_network()4函数函数inet_ntoa()5函数函数inet_makeaddr()6函数函数inet_lnaof()7函数函数inet_netof()8结构结构struct in_addr第9页,本讲稿共27页8.2.2 inet_pton()8.2.2 inet_pton()和和inet_ntop()inet_ntop()函数函数函数函数inet_pton()

7、和函数和函数inet_ntop()是一套安全的协议是一套安全的协议无关的地址转换函数。所谓的无关的地址转换函数。所谓的“安全安全”是相对于是相对于inet_aton()函数的不可重入性来说。这两个函数都是可以重入的,并且函数的不可重入性来说。这两个函数都是可以重入的,并且这些函数支持多种地址类型,包括这些函数支持多种地址类型,包括IPv4和和IPv6。1函数函数inet_pton()2函数函数inet_ntop()第10页,本讲稿共27页8.2.3 8.2.3 使用使用8.2.18.2.1小节地址转换函数的例子小节地址转换函数的例子前面的两个小节对地址转换函数进行了介绍,本节通过前面的两个小节

8、对地址转换函数进行了介绍,本节通过两个例子对上述函数进行简单的说明。两个例子对上述函数进行简单的说明。测试结果表明函数测试结果表明函数inet_ntoa()、inet_addr()是不可重是不可重入的。入的。1初始化设置初始化设置2测试函数测试函数inet_aton()3测试函数测试函数inet_addr()4测试函数测试函数inet_ntoa()5测试函数测试函数inet_ntoa()6测试函数测试函数inet_lnaof()7测试函数测试函数inet_lnaof()8编译运行程序编译运行程序第11页,本讲稿共27页8.2.4 8.2.4 使用函数使用函数inet_ptoninet_pton

9、和函数和函数inet_ntopinet_ntop的例子的例子下面的代码是使用函数下面的代码是使用函数inet_pton和函数和函数inet_ntop的例的例子。在代码中对如何使用这两个函数使用函数子。在代码中对如何使用这两个函数使用函数inet_pton将字将字符串转换为二进制和使用函数符串转换为二进制和使用函数inet_ntop将二进制将二进制IP地址转化地址转化为字符串的简单实例。为字符串的简单实例。#include#include#include#include#include#define ADDRLEN 16int main(int argc,char*argv)struct in_

10、addr ip;char IPSTR=192.168.1.1;char addrADDRLEN;const char*str=NULL;int err=0;err=inet_pton(AF_INET,IPSTR,&ip);if(err 0)printf(inet_pton:ip,%s value is:0 x%xn,IPSTR,ip.s_addr);ip.s_addr=htonl(19224|16816|128|255);/*192.168.12.255*/str=(const char*)inet_ntop(AF_INET,(void*)&ip,(char*)&addr0,ADDRLEN);

11、if(str)printf(inet_ntop:ip,0 x%x is%sn,ip.s_addr,str);return 0;第12页,本讲稿共27页8.3 8.3 套接字描述符判定函数套接字描述符判定函数issockettype()issockettype()套接字文件描述符从形式上与通用文件描述符没有区别,套接字文件描述符从形式上与通用文件描述符没有区别,判断一个文件描述符是否是一个套接字描述符可以通过如下判断一个文件描述符是否是一个套接字描述符可以通过如下的方法实现:先调用函数的方法实现:先调用函数fstat获得文件描述符的模式,然后获得文件描述符的模式,然后将模式的将模式的S_IFMT

12、部分与标识符部分与标识符S_IFSOCK比较可以知道一比较可以知道一个文件描述符是否为套接字描述符。个文件描述符是否为套接字描述符。下面是套接字描述符判定的实例代码。程序代码先构建下面是套接字描述符判定的实例代码。程序代码先构建一个用于测试是否为套接字文件描述符的寒暑一个用于测试是否为套接字文件描述符的寒暑issockettype(),在主函数中对标准输入和构建后的套接字文件描述符进,在主函数中对标准输入和构建后的套接字文件描述符进行是否套接字文件描述符的判断。行是否套接字文件描述符的判断。第13页,本讲稿共27页8.3.1 8.3.1 进行文件描述符判定的函数进行文件描述符判定的函数isso

13、ckettypeissockettype()()这个函数先获得描述符的状态,保存在变量这个函数先获得描述符的状态,保存在变量st中,将中,将st的成员的成员st_mode与与S_IFMT进行进行“与与”运算后获取文件描述运算后获取文件描述符的模式。判断上述值是否与符的模式。判断上述值是否与S_IFSOCK相等,可以知道文相等,可以知道文件描述符是否为套接字文件描述符。件描述符是否为套接字文件描述符。int issockettype(int fd)struct stat st;int err=fstat(fd,&st);if(err 0)return-1;if(st.st_mode&S_IFMT

14、)=S_IFSOCK)return 1;elsereturn 0;第14页,本讲稿共27页8.3.2 main()8.3.2 main()函数函数先判断标准输入是否为套接字文件描述符,将判断结果先判断标准输入是否为套接字文件描述符,将判断结果打印出来。然后建立一个套接字打印出来。然后建立一个套接字s,使用函数,使用函数issocktype对对s进行判断,并将判断结果打印出来。进行判断,并将判断结果打印出来。int main(void)int ret=issockettype(0);printf(value%dn,ret);int s=socket(AF_INET,SOCK_STREAM,0);

15、ret=issockettype(s);printf(value%dn,ret);return 0;第15页,本讲稿共27页8.4 IP8.4 IP地址与域名之间的相互转换地址与域名之间的相互转换在实际的使用中,经常有只知道主机的域名而不知道主在实际的使用中,经常有只知道主机的域名而不知道主机名对应的机名对应的IP地址的情况,而地址的情况,而socket的的API均为基于均为基于IP地址,地址,所以如何进行主机域名和所以如何进行主机域名和IP地址之间的转换是十分必要的。地址之间的转换是十分必要的。本节对本节对DNS的原理和相关的域名转换函数进行介绍。的原理和相关的域名转换函数进行介绍。第16页

16、,本讲稿共27页8.4.1 DNS8.4.1 DNS原理原理DNS(Domain Name System)是)是“域名系统域名系统”的英的英文缩写,域名系统是一种树形结构,按照区域组成层次性的文缩写,域名系统是一种树形结构,按照区域组成层次性的结构,表示计算机名称和结构,表示计算机名称和IP地址的对应情况。地址的对应情况。DNS用于用于TCP/IP的网络,用比较形象化的友好命名来代替枯燥的的网络,用比较形象化的友好命名来代替枯燥的IP地地址,方便用户记忆。址,方便用户记忆。DNS的功能就是在主机的名称和的功能就是在主机的名称和IP地址地址之间担任翻译的作用。之间担任翻译的作用。1DNS查询过程

17、查询过程2DNS的拓扑结构的拓扑结构第17页,本讲稿共27页8.4.1 DNS8.4.1 DNS原理原理第18页,本讲稿共27页8.4.2 8.4.2 获取主机信息的函数获取主机信息的函数函数函数gethostbyname()和和gethostbyaddr()都可以获得都可以获得主机的信息。函数主机的信息。函数gethostbyname()通过主机的名称获得主通过主机的名称获得主机的信息,函数机的信息,函数gethostbyaddr()通过通过IP地址获得主机的信地址获得主机的信息。息。1函数函数gethostbyname()2函数函数gethostbyaddr()第19页,本讲稿共27页8.

18、4.2 8.4.2 获取主机信息的函数获取主机信息的函数第20页,本讲稿共27页8.4.3 8.4.3 使用主机名获取主机信息的例子使用主机名获取主机信息的例子下面的例子代码查询下面的例子代码查询的信息,并将的信息,并将主机的信息打印出来。主机的信息打印出来。1获得主机名获得主机名2打印主机相关信息打印主机相关信息3编译运行程序编译运行程序第21页,本讲稿共27页8.4.4 8.4.4 函数函数gethostbyname()gethostbyname()不可重入的例子不可重入的例子在在8.3.2小节例子的基础上,修改其代码,先调用小节例子的基础上,修改其代码,先调用gethostbyname(

19、)函数获得函数获得的信息,然后调用的信息,然后调用gethostbyname()函数获得函数获得的信息,打印输出消息。的信息,打印输出消息。第22页,本讲稿共27页8.5 8.5 协议名称处理函数协议名称处理函数为了方便操作,为了方便操作,Linux提供了一组用于查询协议的值及提供了一组用于查询协议的值及名称的函数。本节对相关的函数及使用方法和注意事项进行名称的函数。本节对相关的函数及使用方法和注意事项进行简单的介绍。简单的介绍。第23页,本讲稿共27页8.5.1 8.5.1 函数函数xxxprotoxxx()xxxprotoxxx()协议族处理函数有如下几个,可以通过协议的名称、编协议族处理

20、函数有如下几个,可以通过协议的名称、编号等获取协议类型。号等获取协议类型。#include struct protoent*getprotoent(void);/*从协议文件中从协议文件中读取一行读取一行*/struct protoent*getprotobyname(const char*name);/*从协议文件中找到匹配项从协议文件中找到匹配项*/struct protoent*getprotobynumber(int proto);/*按照协议类型的值获取匹配项按照协议类型的值获取匹配项*/void setprotoent(int stayopen);/*设置协议文件打设置协议文件打开

21、状态开状态*/void endprotoent(void);/*关闭协议文件关闭协议文件*/第24页,本讲稿共27页8.5.1 8.5.1 函数函数xxxprotoxxx()xxxprotoxxx()第25页,本讲稿共27页8.5.2 8.5.2 使用协议族函数的例子使用协议族函数的例子如下的例子按照名称查询一组协议的项目,首先用如下的例子按照名称查询一组协议的项目,首先用setprotoent(1)打开文件打开文件/etc/protocols,然后使用函数,然后使用函数getprotobyname()查询函数并显示出来,最后使用函数查询函数并显示出来,最后使用函数endprotoent()关

22、闭文关闭文件件/etc/protocols。代码如下。代码如下。1显示显示协议项目函数显示显示协议项目函数display_protocol()2主函数主函数main()第26页,本讲稿共27页8.6 8.6 小结小结本章中介绍了字节序转换函数和主机信息获取的函数,本章中介绍了字节序转换函数和主机信息获取的函数,并介绍了通过协议的名称和值来获取协议选项的方法。地址并介绍了通过协议的名称和值来获取协议选项的方法。地址转换函数和获取主机信息的函数有一部分是不可重入的,在转换函数和获取主机信息的函数有一部分是不可重入的,在进行程序设计的时候要注意,函数调用完毕后及时将结果取进行程序设计的时候要注意,函数调用完毕后及时将结果取出。目前的出。目前的gethostbyname和和gethostbyaddr已经不推荐已经不推荐使用,有代替函数出现,可以用于使用,有代替函数出现,可以用于IPv4和和IPv6,并且是线程,并且是线程安全的,即安全的,即getaddrinfo和和getnameinfo,参见第,参见第15章的章的IPv6部分,其中进行了详细的介绍。部分,其中进行了详细的介绍。第27页,本讲稿共27页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁