版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式网络编程第1页,共27页,2023年,2月20日,星期一8.1字节序字节序是由于不同的主处理器和操作系统对大于一个字节的变量在内存中的存放顺序不同而产生的,例如两个字节的shortint和四个字节的int类型变量都有字节序的问题。字节序通常有大端字节序和小端字节序的两种分类方法。第2页,共27页,2023年,2月20日,星期一8.1.1大端字节序和小端字节序字节序是由于CPU和OS对多字节变量的内存存储顺序不同而产生的。1.字节序介绍2.字节序的例子第3页,共27页,2023年,2月20日,星期一8.1.2字节序转换函数由于主机的千差万别,主机的字节序不能做到统一,但是对于网络上传输的变量,它们的值必须有一个统一的表示方法。网络字节序是指多字节变量在网络传输时的表示方法,网络字节序采用高端字节序的表示方法。这样小端字节序的系统通过网络传输变量的时候需要进行字节序的转换,大端字节序的变量则不需要进行转换。1.字节序转换函数介绍2.字节序转换的方法第4页,共27页,2023年,2月20日,星期一8.1.2字节序转换函数第5页,共27页,2023年,2月20日,星期一8.1.2字节序转换函数第6页,共27页,2023年,2月20日,星期一8.1.3一个字节序转换的例子下面的例子是对16位数值和32位数值进行字节序转换,每种类型的数值进行两次转换,最后打印结果。1.16位字节序转换结构2.32位字节序转换结构3.变量值打印函数showvalue4.主函数main5.16位值0xabcd的二次转换6.32位值0x12345678的二次转换7.结果打印8.编译运行程序第7页,共27页,2023年,2月20日,星期一8.2字符串IP地址和二进制IP地址的转换人们可以理解的IP地址表达方式是类似“”这样的字符串;而计算机理解的则是像0x01111111000000000000000000000001()这样表达的IP地址方式。在网络程序的设计中,经常需要进行字符串表达方式的IP地址和二进制的IP地址之间的转换,本节对此类函数进行介绍。第8页,共27页,2023年,2月20日,星期一8.2.1inet_xxx()函数Linux操作系统有一组函数用于网络地址的字符串形式和二进制形式之间的转换,其形式为inet_xxx()。函数的原型如下:#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>1.函数inet_aton()2.函数inet_addr()3.函数inet_network()4.函数inet_ntoa()5.函数inet_makeaddr()6.函数inet_lnaof()7.函数inet_netof()8.结构structin_addr第9页,共27页,2023年,2月20日,星期一8.2.2inet_pton()和inet_ntop()函数函数inet_pton()和函数inet_ntop()是一套安全的协议无关的地址转换函数。所谓的“安全”是相对于inet_aton()函数的不可重入性来说。这两个函数都是可以重入的,并且这些函数支持多种地址类型,包括IPv4和IPv6。1.函数inet_pton()2.函数inet_ntop()第10页,共27页,2023年,2月20日,星期一8.2.3使用8.2.1小节地址转换函数的例子前面的两个小节对地址转换函数进行了介绍,本节通过两个例子对上述函数进行简单的说明。测试结果表明函数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页,2023年,2月20日,星期一8.2.4使用函数inet_pton和函数inet_ntop的例子下面的代码是使用函数inet_pton和函数inet_ntop的例子。在代码中对如何使用这两个函数使用函数inet_pton将字符串转换为二进制和使用函数inet_ntop将二进制IP地址转化为字符串的简单实例。#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<stdio.h>#include<string.h>#defineADDRLEN16intmain(intargc,char*argv[]){structin_addrip;charIPSTR[]=""; charaddr[ADDRLEN]; constchar*str=NULL; interr=0; err=inet_pton(AF_INET,IPSTR,&ip); if(err>0){printf("inet_pton:ip,%svalueis:0x%x\n",IPSTR,ip.s_addr);}ip.s_addr=htonl(192<<24|168<<16|12<<8|255); /*55*/str=(constchar*)inet_ntop(AF_INET,(void*)&ip,(char*)&addr[0],ADDRLEN);if(str){printf("inet_ntop:ip,0x%xis%s\n",ip.s_addr,str); }return0; }第12页,共27页,2023年,2月20日,星期一8.3套接字描述符判定函数issockettype()套接字文件描述符从形式上与通用文件描述符没有区别,判断一个文件描述符是否是一个套接字描述符可以通过如下的方法实现:先调用函数fstat获得文件描述符的模式,然后将模式的S_IFMT部分与标识符S_IFSOCK比较可以知道一个文件描述符是否为套接字描述符。下面是套接字描述符判定的实例代码。程序代码先构建一个用于测试是否为套接字文件描述符的寒暑issockettype(),在主函数中对标准输入和构建后的套接字文件描述符进行是否套接字文件描述符的判断。第13页,共27页,2023年,2月20日,星期一8.3.1进行文件描述符判定的函数issockettype()这个函数先获得描述符的状态,保存在变量st中,将st的成员st_mode与S_IFMT进行“与”运算后获取文件描述符的模式。判断上述值是否与S_IFSOCK相等,可以知道文件描述符是否为套接字文件描述符。intissockettype(intfd){structstatst;interr= fstat(fd,&st); if(err<0) {return-1; }if((st.st_mode&S_IFMT)==S_IFSOCK) { return1;} else{return0;}}第14页,共27页,2023年,2月20日,星期一8.3.2main()函数先判断标准输入是否为套接字文件描述符,将判断结果打印出来。然后建立一个套接字s,使用函数issocktype对s进行判断,并将判断结果打印出来。intmain(void){intret=issockettype(0); printf("value%d\n",ret);ints=socket(AF_INET,SOCK_STREAM,0); ret=issockettype(s); printf("value%d\n",ret); return0; }第15页,共27页,2023年,2月20日,星期一8.4IP地址与域名之间的相互转换在实际的使用中,经常有只知道主机的域名而不知道主机名对应的IP地址的情况,而socket的API均为基于IP地址,所以如何进行主机域名和IP地址之间的转换是十分必要的。本节对DNS的原理和相关的域名转换函数进行介绍。第16页,共27页,2023年,2月20日,星期一8.4.1DNS原理DNS(DomainNameSystem)是“域名系统”的英文缩写,域名系统是一种树形结构,按照区域组成层次性的结构,表示计算机名称和IP地址的对应情况。DNS用于TCP/IP的网络,用比较形象化的友好命名来代替枯燥的IP地址,方便用户记忆。DNS的功能就是在主机的名称和IP地址之间担任翻译的作用。1.DNS查询过程2.DNS的拓扑结构第17页,共27页,2023年,2月20日,星期一8.4.1DNS原理第18页,共27页,2023年,2月20日,星期一8.4.2获取主机信息的函数函数gethostbyname()和gethostbyaddr()都可以获得主机的信息。函数gethostbyname()通过主机的名称获得主机的信息,函数gethostbyaddr()通过IP地址获得主机的信息。1.函数gethostbyname()2.函数gethostbyaddr()第19页,共27页,2023年,2月20日,星期一8.4.2获取主机信息的函数第20页,共27页,2023年,2月20日,星期一8.4.3使用主机名获取主机信息的例子下面的例子代码查询的信息,并将主机的信息打印出来。1.获得主机名2.打印主机相关信息3.编译运行程序第21页,共27页,2023年,2月20日,星期一8.4.4函数gethostbyname()不可重入的例子在8.3.2小节例子的基础上,修改其代码,先调用gethostbyname()函数获得的信息,然后调用gethostbyname()函数获得的信息,打印输出消息。第22页,共27页,2023年,2月20日,星期一8.5协议名称处理函数为了方便操作,Linux提供了一组用于查询协议的值及名称的函数。本节对相关的函数及使用方法和注意事项进行简单的介绍。第23页,共27页,2023年,2月20日,星期一8.5.1函数xxxprotoxxx()协议族处理函数有如下几个,可以通过协议的名称、编号等获取协议类型。#include<netdb.h>structprotoent*getprotoent(void); /*从协议文件中读取一行*/structprotoent*getprotobyname(constchar*name); /*从协议文件中找到匹配项*/structprotoent*getprotobynumber(intproto); /*按照协议类型的值获取匹配项*/voidsetprotoent(intstayopen); /*设置协议文件打开状态*/voidendprotoent(void); /*关闭协议文件*/第24页,共27页,2023年,2月20日,星期一8.5.1函数xxxprotoxxx()第25页,共27页,2023年,2月20日,星期一8.5.2使用协议族函数的例子如下的例子按照名称查询一组协议的项目,首先用setprotoent(1)打开文件/etc/protocols,然后使用函数getprotobyname()查询函数并显示出来,最后使用函数endprotoent()关闭文件/etc/protocols。代码如下。1.显示显示协议项目函数display_protocol()2.主函数main()第26页,共27页,2023年,2月20日
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淮阴师范学院《京杭大运河主题设计》2022-2023学年第一学期期末试卷
- 夏日拖鞋课件教学课件
- 淮阴师范学院《中学思想政治学科课程标准与教材分析》2022-2023学年第一学期期末试卷
- 淮阴师范学院《中国古代文学作品选(3)》2021-2022学年第一学期期末试卷
- 沟通魅力课件教学课件
- 简单护理课件教学课件
- 淮阴师范学院《法学概论》2023-2024学年期末试卷
- 淮阴师范学院《大众健美操》2021-2022学年第一学期期末试卷
- 淮阴工学院《液压与气压传动》2021-2022学年第一学期期末试卷
- 淮阴工学院《投资学》2022-2023学年第一学期期末试卷
- 语文教学常规检查表
- “思政”课社会实践
- 临时用电漏电保护器运行检测记录表
- 复杂性尿路感染
- 重度残疾儿童送教上门
- 膀胱癌综合治疗新进展
- 音乐ppt课件《小小的船》
- 中药传统技能大赛(高职组)考试题库(浓缩500题)
- 疏浚与吹填技术
- 红十字救护员知识考试复习题库200题(含答案)
- 井冈山斗争和井冈山精神教学课件
评论
0/150
提交评论