嵌入式Linux网络应用开发_第1页
嵌入式Linux网络应用开发_第2页
嵌入式Linux网络应用开发_第3页
嵌入式Linux网络应用开发_第4页
嵌入式Linux网络应用开发_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章嵌入式Linux网络应用开发教材:嵌入式系统设计与应用张思民出版:清华大学出版社第7章嵌入式Linux网络应用开发

7.1网络编程的根底知识IP地址和端口号套接字7.2Socket网络编程Socket网络函数socket网络编程例如7.3嵌入式系统的Web效劳器程序设计Web效劳器Web效劳器的程序设计7.4开发新的TCP通信协议7.1网络编程根底知识IP地址和端口号1、客户端程序和效劳端程序网络程序和单机程序的最大区别在于,网络程序是由两个局部组成的—客户端程序和效劳端程序。在网络中,安装并运行效劳端程序的计算机称为效劳器,而运行客户端程序的计算机称为客户机。IP地址和端口号1、客户端程序和效劳端程序网络通信时,先启动效劳端程序,等待客户端发起连接。一旦有客户端发来了连接请求,效劳端随之响应,从而建立起一条数据通信信道。连接过程如下图。…….…….连接请求响应IP地址和端口号2、IP地址网络中连接了很多计算机,假设计算机A向计算机B发送信息,假设网络中还有第三台计算机C,那么主机A怎么知道信息被正确传送到主机B而不是被传送到主机C中了呢?如下图。IP地址和端口号2、IP地址在网络上的每台计算机都必须有一个唯一的IP地址作为标识,网络中的计算机那么通过IP地址找到要传送数据的另一台主机。IP地址通常写作一组由“.〞号分隔的十进制数,如:

3、端口由于一台计算机上可同时运行多个网络程序,IP地址只能保证把数据信息送到该计算机,但无法知道要把这些数据交给该主机上的哪个网络程序。用“端口号〞标识正在计算机上运行的进程〔程序〕。端口号是一个整数,其取值范围为0~65535之间。3、端口每个被发送的网络数据包也都包含有“端口号〞,用于将该数据帧交给具有相同端口号的应用程序来处理。4、TCP与UDP协议“传输控制协议〞〔TransmissionControlProtocol,简称TCP〕。TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无过失的数据传输。应用程序利用TCP进行通信时,信息源与信息目标之间会建立一个虚连接。这个连接一旦建立成功,两台计算机之间就可以把数据当作一个双向字节流进行交换。4、TCP与UDP协议“用户数据报协议〞〔UserDatagramProtocol,简称:UDP〕。UDP是无连接通信协议,UDP不保证可靠数据的传输。简单地说,如果一个主机向另外—台主机发送数据,这一数据就会立即发出,而不管另外一台主机是否巳准备接收数据。套接字1、什么是套接字在TCP/IP通信协议中,套接字〔Socket〕就是IP地址与端口号的组合。如下图,IP地址与端口号13组成一个套接字。2、套接字类型〔1〕字节流套接字,基于TCP协议的连接和传输方式,又称为TCP套接字。〔2〕数据报套接字,基于UDP协议的连接和传输方式,又称为UDP套接字。〔3〕原始套接字,原始套接字允许对底层协议如IP或ICMP进行直接访问,提供TCP套接字和UDP套接字所不提供的功能,主要用于对一些协议的开发,如构造自己的TCP或UDP分组等。Socket网络函数1、socket函数调用socket函数获得一个套接字描述符。函数原型为:intsocket(intfamily,inttype,intprotocol);函数返回值:成功那么返回套接字描述符,这是一个非负整数,假设出错那么返回-1。协议簇套接字类型是否原始套接字2、bind函数该函数为套接字描述符分配一个本地IP地址和一个端口号,将IP地址和端口号与套接字描述符绑定在一起。函数原型为:intbind(intsockfd,structsockaddr*myaddr,intaddrlen);函数返回值:假设调用成功那么返回0,假设出错那么返回-1。套接字结构体指针结构体长度3、地址结构在网络编程中有二个很重要的数据类型,它们是地址结构structsockaddr和structsockaddr_in,这两个数据类型都是用来存放socket信息的。Structsockaddr的结构structsockaddr{

unsignedshortsa_family;/*通信协议类型族,AF_xxx*/

charsa_data[14];/*14字节协议地址,包含该socket的IP地址和端口号*/

};structsockaddr_in数据结构:structsockaddr_in{

sin_family;/*通信协议类型族*/

sin_port;/*端口号*/

structin_addrsin_addr;/*IP地址*/

unsignedcharsin_zero[8];/*填充0以保持与sockaddr结构的长度相同*/

};4、connect函数该函数用于在客户端通过socket套接字建立网络连接。函数原型为:intconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);函数返回值:假设连接成功那么返回0,假设连接失败那么返回-1。5、listen函数listen函数应用于TCP连接的效劳程序,它的作用是通过socket套接字等待来自客户端的连接请求。函数原型为:intlisten(intsockfd,intbacklog);函数返回值:假设连接成功那么返回0,假设连接失败那么返回-1。6、accept函数accept调用后,效劳器程序会一直处于阻塞状态,等待来自客户端的连接请求。intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen);函数返回值:假设接收到客户端的连接请求,那么返回非负的套接字描述符,假设失败,那么返回-1。7、send〔〕和recv〔〕函数这两个函数分别用于发送和接收数据。intsend(intsockfd,constvoid*msg,intlen,intflags);intrecv(intsockfd,void*buf,intlen,unsignedintflags);函数返回值:send函数返回发送的字节数,recv函数返回接收数据的字节数。假设出错那么返回-1。8、sendto〔〕和recvfrom〔〕函数这两个函数的作用与send〔〕和recv〔〕函数类似,也是用于发送和接收数据。send〔〕和recv〔〕函数用于TCP协议sendto〔〕和recvfrom〔〕函数用于UDP协议socket网络编程例如1、程序流程利用Socket方式进行数据通信与传输,有如下步骤:〔1〕创立效劳端socket,绑定建立连接的端口。〔2〕效劳端程序在一个端口处于阻塞状态,等待客户机的连接。〔3〕创立客户端socket对象,绑定主机名称或IP地址,指定连接端口号。〔4〕客户机Socket发起连接请求。〔5〕建立连接。〔6〕利用send/sendto和recv/recvfrom进行数据传输。〔7〕关闭socket。2、效劳端程序server.c〔1〕首先,需要创立一个用于通讯的TCP协议的socked套接字描述符。sockfd=socket(AF_INET,SOCK_STREAM,0);printf("socketSuccess!,sockfd=%d\n",sockfd);〔2〕然后,在效劳器端初始化sockaddr结构体,设定套接字端口号:my_addr.sin_family=AF_INET;my_addr.sin_port=htons(4321);=INADDR_ANY;bzero(&(my_addr.sin_zero),8);〔3〕将定义的sockaddr结构体与socked套接字描述符进行绑定。bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr);〔4〕调用listen函数使socked套接字成为一个监听套接字。它与下一步骤的accept函数共同完成对套接字端口的监听。listen(sockfd,10);〔5〕调用accept函数监听套接字端口,等待客户端的连接。一旦建立连接,将产生一个全新的套接字。

new_fd=accept(sockfd,(structsockaddr*)&their_addr,&sin_size);〔6〕处理客户端的会话请求。将接收到的数据存放到字符型数组buff中。

//读取客户端发来的信息numbytes=recv(new_fd,buff,strlen(buff),0);//向客户端发送信息send(sockfd,"Hello!IamServer.",19,0);〔7〕终止连接。通信结束那么断开连接。

close(sockfd);3、客户端程序client.c〔1〕和效劳器的步骤一样,首先需要创立一个socked套接字描述符。

sockfd=socket(AF_INET,SOCK_STREAM,0)〔2〕然后,在客户端初始化sockaddr结构体,并调用函数gethostbyname()获取从命令行输入的效劳器IP地址,设定与效劳器程序相同的端口号〔比方,效劳器的端口号是4321,那么这里也必须设为4321〕〔3〕调用connect函数来连接效劳器。

connect(sockfd,(structsockaddr*)&their_addr,sizeof(structsockaddr));〔4〕发送或者接收数据,一般使用send和recv函数调用来实现〔与效劳器程序相同〕。

〔5〕终止连接〔与效劳器程序相同〕。7.3嵌入式系统的

Web效劳器程序设计Web效劳器1、HTTP协议2、Web效劳器的工作原理Web效劳器的程序设计1、建立Web效劳器的主要步骤〔1〕建立客户端与效劳器端的socket套接字通信效劳器端建立基于TCP效劳的socket套接字通信,一般需要经过3个过程:创立一个socket套接字描述符:sockfd=socket(AF_INET,SOCK_STREAM,0);给socket绑定一个地址和端口号:bind(sockfd,(structsockaddr*)&server_sockaddr,sizeof(server_sockaddr));监听套接字端口,等待连接请求,一旦有接入,那么创立一个新套接字描述符fd:listen(sockfd,8*3);fd=accept(sockfd,(void*)&ec,&len);〔2〕客户端连接处理调用函数HandleConnect()处理客户端的连接请求。在这个函数中,我们用fdopen()函数将套接字描述符fd转为文件指针,再用fgets()函数将其内容存放到缓冲区中,以便对其请求进行分析处理。〔3〕分析和处理客户请求在函数ParseReq()中解析和处理客户请求。主要是去除掉空白符〔空格、换页、换行、回车、制表符等〕。〔4〕复制一个Web文档副本发送给客户Web效劳器根据解析处理,将客户请求的内容,复制成一个文档副本,以HTML文件方式发送给用户。【例7-3】编写一个简易的Web效劳器程序。〔见教材〕7.4开发新的TCP通信协议开发一个新的基于TCP的新协议MTCP。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论