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

下载本文档

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

文档简介

1、第第7章章 嵌入式嵌入式Linux网络应用开发网络应用开发嵌入式系统及其应用重庆大学电气工程学院本章要点本章要点 1、IP地址、端口号及网络套接字等概念地址、端口号及网络套接字等概念 2、利用套接字进行网络编程的方法、利用套接字进行网络编程的方法 3、编写客户机服务器系统的应用程序、编写客户机服务器系统的应用程序 4、编写嵌入式系统的、编写嵌入式系统的Web服务器程序服务器程序 5、开发新的、开发新的TCP通信协议通信协议嵌入式系统及其应用重庆大学电气工程学院7.1网络编程基础知识网络编程基础知识嵌入式系统及其应用重庆大学电气工程学院7.1.1IP地址和端口号地址和端口号 1、 客户端程序和服

2、务端程序客户端程序和服务端程序 2、IP地址地址 嵌入式系统及其应用3、端口、端口 “端口号端口号” 标识正在计算机上运行的进程标识正在计算机上运行的进程(程序)。(程序)。 端口号是一个整数,其取值范围为端口号是一个整数,其取值范围为065535之间。之间。 嵌入式系统及其应用4、TCP与与UDP协议协议 “传输控制协议传输控制协议”(Transmission Control Protocol,简称,简称TCP), “用户数据报协议用户数据报协议”(User Datagram Protocol,简称:,简称:UDP)。)。 重庆大学电气工程学院嵌入式系统及其应用TCP/IP的分层模型的分层模

3、型 OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。 嵌入式系统及其应用重庆大学电气工程学院 TCP/IP的协议参考模型和OSI协议参考模型的对应关系如下图 :嵌入式系统及其应用重庆大学电气工程学院 网络接口层(网络接口层(Network Interface Layer)

4、 网络接口层是网络接口层是TCP/IP协议软件的最底层,协议软件的最底层,负责将二进制流转换为数据帧,并进行数负责将二进制流转换为数据帧,并进行数据帧的发送和接收。数据帧是网络传输的据帧的发送和接收。数据帧是网络传输的基本单元。基本单元。嵌入式系统及其应用重庆大学电气工程学院 网络层(网络层(Internet Layer) 网络层负责在主机之间的通信中选择数据报的传输网络层负责在主机之间的通信中选择数据报的传输路径,即路由路径,即路由。当网络层接收到传输层的请求后,传输某个具有目的地址信息的分组。该层把分组封装在IP数据报中,填入数据报的首部,使用路由算法来确定是直接交付数据报,还是把它传递给

5、路由器,然后把数据报交给适当的网络接口进行传输。 网络层还要负责处理传入的数据报,检验其有效性,使用路由算法来决定应该对数据报进行本地处理还是应该转发。 如果数据报的目的机处于本机所在的网络,该层软件就会除去数据报的首部,再选择适当的运输层协议来处理这个分组。最后,网络层还要根据需要发出和接收ICMP(Internet控制报文协议)差错和控制报文。嵌入式系统及其应用重庆大学电气工程学院 传输层(传输层(Transport Layer) 传输层负责提供应用程序之间的通信服务。这传输层负责提供应用程序之间的通信服务。这种通信又称为端到端通信。传输层要系统地管理种通信又称为端到端通信。传输层要系统地

6、管理信息的流动,还要提供可靠的传输服务,以确保信息的流动,还要提供可靠的传输服务,以确保数据到达无差错、无乱序。为了达到这个目的,数据到达无差错、无乱序。为了达到这个目的,传输层协议软件要进行协商,让接收方回送确认传输层协议软件要进行协商,让接收方回送确认信息及让发送方重发丢失的分组。传输层协议软信息及让发送方重发丢失的分组。传输层协议软件把要传输的数据流划分为分组,把每个分组连件把要传输的数据流划分为分组,把每个分组连同目的地址交给网络层去发送。同目的地址交给网络层去发送。嵌入式系统及其应用重庆大学电气工程学院 应用层(应用层(Application Layer) 应用层是分层模型的最高层,

7、在这个最高层应用层是分层模型的最高层,在这个最高层中,用户调用应用程序通过中,用户调用应用程序通过TCP/IP互联网来访问互联网来访问可行的服务。与各个传输层协议交互的应用程序可行的服务。与各个传输层协议交互的应用程序负责接收和发送数据。每个应用程序选择适当的负责接收和发送数据。每个应用程序选择适当的传输服务类型,把数据按照传输层的格式要求封传输服务类型,把数据按照传输层的格式要求封装好向下层传输。装好向下层传输。嵌入式系统及其应用重庆大学电气工程学院 TCP/IP分层模型中有两大边界特性:一个是地址边界特性,它将IP逻辑地址与底层网络的硬件地址分开;一个是操作系统边界特性,它将网络应用与协议

8、软件分开 。嵌入式系统及其应用重庆大学电气工程学院 IP层特性层特性 IP层作为通信子网的最高层,提供无连接的数层作为通信子网的最高层,提供无连接的数据报传输机制据报传输机制,但IP协议并不能保证IP报文传递的可靠性,IP的机制是点到点的。用IP进行通信的主机或路由器位于同一物理网络,对等机器之间拥有直接的物理连接。 IP向上层提供统一的向上层提供统一的IP报文报文,使得各种网络帧或报文格式的差异性对高层协议不复存在。IP层是TCP/IP实现异构网互联最关键的一层。嵌入式系统及其应用重庆大学电气工程学院 TCP/IP的可靠性特性 在TCP/IP网络中,IP采用无连接的数据报机制,对数据进行“尽

9、力而为”的传递机制,即只管将报文尽力传送到目的主机,无论传输正确与否,不做验证,不发确认,也不保证报文的顺序。TCP/IP的可靠性体现在传输层协议之一的的可靠性体现在传输层协议之一的TCP协议协议。TCP协议提供面向连接的服务,因为传输层是端到端的,所以TCP/IP的可靠性被称为端到端可靠性。 TCP/IP的特点就是将不同的底层物理网络、拓扑结构隐的特点就是将不同的底层物理网络、拓扑结构隐藏起来,向用户和应用程序提供通用、统一的网络服务藏起来,向用户和应用程序提供通用、统一的网络服务。这样,从用户的角度看,整个TCP/IP互联网就是一个统一的整体,它独立于具体的各种物理网络技术,能够向用户提供

10、一个通用的网络服务。 TCP/IP网络完全撇开了底层物理网络的特性网络完全撇开了底层物理网络的特性,是一个高度抽象的概念,正是由于这个原因,其为TCP/IP网络赋予了巨大的灵活性和通用性。重庆大学电气工程学院嵌入式系统及其应用TCP/IP核心协议核心协议 在TCP/IP协议族中,有很多种协议 。 用户进程 用户进程 ICMP TCP IGMP UDP ARP RARP IP IP 应用层 传输层 网络层 网络接口层 嵌入式系统及其应用重庆大学电气工程学院 TCP TCP的上一层是应用层,TCP向应用层提供可靠的面向对象的数据流传输服务,TCP数据传输实现了从一个应用程序到另一个应用程序的数据传

11、递。它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信。),应用程序通过向TCP层提交数据接发送/收端的地址和端口号而实现应用层的数据通信。 通过IP的源/目的可以惟一地区分网络中两个设备的连接,通过socket的源/目的可以惟一地区分网络中两个应用程序的连接。嵌入式系统及其应用重庆大学电气工程学院 三次握手三次握手 TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后进行数据通信,最后拆除连接三个过程。TCP在建立连接时又分三步走: 第一步(A-B):主机A向主机B发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同

12、步报文会指明客户端使用的端口以及TCP连接的初始序号; 第二步(B-A):主机B在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示主机A的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement); 第三步(A-B):主机A也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。 嵌入式系统及其应用重庆大学电气工程学院 SYN J SYN K,ACK J+1 ACK K+1 嵌入式系统及其应用重庆大学电气工程学院 TCP数据包头嵌入式系统及其应用重庆大学电气工程学院 UDP UDP即用户数据报协议,是一种面向无连接的不可靠传输协议

13、,不需要通过3次握手来建立一个连接,同时,一个UDP应用可同时作为应用的客户或服务器方。 由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多。UDP比TCP协议更为高效,也能更好地解决实时性的问题,如今,包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都使用UDP协议。嵌入式系统及其应用重庆大学电气工程学院 UDP数据包头嵌入式系统及其应用重庆大学电气工程学院 协议选择协议选择 协议的选择应该考虑到数据可靠性、应用的实时性和网络的可靠性。 对数据可靠性要求高的应用需选择TCP协议,而对数据的可靠性要求不那么高的应用可选择UDP传送。 TCP协议中的

14、3次握手、重传确认等手段可以保证数据传输的可靠性,但使用TCP协议会有较大的时延,因此不适合对实时性要求较高的应用;而UDP协议则有很好的实时性。 网络状况不是很好的情况下需选用TCP协议(如在广域网等情况),网络状况很好的情况下选择UDP协议可以减少网络负荷。嵌入式系统及其应用重庆大学电气工程学院7.1.2套接字套接字嵌入式系统及其应用重庆大学电气工程学院1、什么是套接字、什么是套接字 在在TCP/IP通信协通信协议中,套接字议中,套接字(Socket)就是)就是IP地址与端口号地址与端口号的组合。的组合。 如图所示,如图所示,IP地地址址与与端口号端口号13组成一组成

15、一个套接字。个套接字。 嵌入式系统及其应用重庆大学电气工程学院 在Linux中的网络编程是通过socket接口来进行的。套接字(socket)是一种特殊的I/O接口,它也是一种文件描述符。socket是一种常用的进程之间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网络能够在不同机器上的进程之间进行通信。 每一个socket都用一个半相关描述(协议、本地地址、本地端口)来表示;一个完整的套接字则用一个相关描述(协议、本地地址、本地端口、远程地址、远程端口)来表示。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作

16、都是通过socket来实现的。嵌入式系统及其应用重庆大学电气工程学院2、套接字类型、套接字类型 (1)字节流套接字,基于)字节流套接字,基于TCP协议的连接协议的连接和传输方式,又称为和传输方式,又称为TCP套接字。套接字。 (2)数据报套接字,基于)数据报套接字,基于UDP协议的连接协议的连接和传输方式,又称为和传输方式,又称为UDP套接字。套接字。 (3)原始套接字,原始套接字允许对底层)原始套接字,原始套接字允许对底层协议如协议如IP或或ICMP进行直接访问,提供进行直接访问,提供TCP套接字和套接字和UDP套接字所不提供的功能,主套接字所不提供的功能,主要用于对一些协议的开发,如构造自

17、己的要用于对一些协议的开发,如构造自己的TCP或或UDP分组等。分组等。 嵌入式系统及其应用重庆大学电气工程学院7.2.1Socket网络函数网络函数 嵌入式系统及其应用重庆大学电气工程学院函数说明函数说明 socket()创建套接字 bind()绑定本机端口 connect()建立连接 listen()监听端口 accept()接受连接 recv(), read(), recvfrom()数据接收 send(), write(), sendto()数据发送 close(), shutdown()关闭套接字嵌入式系统及其应用重庆大学电气工程学院使用使用TCP时时Socket编程编程嵌入式系统及

18、其应用重庆大学电气工程学院使用使用UDP时时Socket编程编程嵌入式系统及其应用重庆大学电气工程学院1、socket函数函数 调用调用socket函数获得一个套接字描述符。函数获得一个套接字描述符。 嵌入式系统及其应用重庆大学电气工程学院2、bind函数函数 该函数为套接字描述符分配一个本地该函数为套接字描述符分配一个本地IP地地址和一个端口号,将址和一个端口号,将IP地址和端口号与套地址和端口号与套接字描述符绑定在一起。接字描述符绑定在一起。 嵌入式系统及其应用重庆大学电气工程学院嵌入式系统及其应用重庆大学电气工程学院bind()函数语法:3、connect函数函数 该函数用于在客户端通过

19、该函数用于在客户端通过socket套接字建套接字建立网络连接。立网络连接。 嵌入式系统及其应用重庆大学电气工程学院connect()函数语法:函数语法:嵌入式系统及其应用重庆大学电气工程学院5、listen函数函数 listen函数应用于函数应用于TCP连接的服务程序,它连接的服务程序,它的作用是通过的作用是通过socket套接字等待来自客户套接字等待来自客户端的连接请求。端的连接请求。 嵌入式系统及其应用重庆大学电气工程学院listen()函数语法:函数语法:嵌入式系统及其应用重庆大学电气工程学院6、accept函数函数 accept调用后,服务器程序会一直处于阻调用后,服务器程序会一直处于

20、阻塞状态,等待来自客户端的连接请求。塞状态,等待来自客户端的连接请求。 嵌入式系统及其应用重庆大学电气工程学院accept()函数语法:函数语法:嵌入式系统及其应用重庆大学电气工程学院7、send()和()和 recv()函数()函数 这两个函数分别用于发送和接收数据。这两个函数分别用于发送和接收数据。 嵌入式系统及其应用重庆大学电气工程学院send()函数语法:函数语法:嵌入式系统及其应用重庆大学电气工程学院recv()函数语法函数语法嵌入式系统及其应用重庆大学电气工程学院8、sendto()和()和recvfrom()函数()函数 这两个函数的作用与这两个函数的作用与send()和()和

21、recv()()函数类似,也是用于发送和接收数据。函数类似,也是用于发送和接收数据。 嵌入式系统及其应用重庆大学电气工程学院sendto()函数语法:函数语法:重庆大学电气工程学院嵌入式系统及其应用recvfrom()函数语法:函数语法:嵌入式系统及其应用重庆大学电气工程学院3、地址结构、地址结构 在网络编程中有二个很重要的数据类型,在网络编程中有二个很重要的数据类型,它们是地址结构它们是地址结构struct sockaddr和和struct sockaddr_in,这两个数据类型都是用来存,这两个数据类型都是用来存放放socket信息的。信息的。 嵌入式系统及其应用重庆大学电气工程学院Str

22、uct sockaddr的结构的结构 struct sockaddr unsignedshort sa_family; /* 通信协议类型族通信协议类型族, AF_xxx */ charsa_data14; /* 14字节协议地址,包含该字节协议地址,包含该socket的的IP地址和端口号地址和端口号 */ ; 嵌入式系统及其应用重庆大学电气工程学院structsockaddr_in数据结构:数据结构: structsockaddr_in shortint sin_family; /* 通信协议类型族通信协议类型族 */ unsignedshortint sin_port; /* 端口号端口号

23、 */ structin_addrsin_addr; /* IP地址地址 */ unsignedcharsin_zero8; /* 填充填充0以保持与以保持与sockaddr结构的长度相同结构的长度相同*/ ; 嵌入式系统及其应用重庆大学电气工程学院 这两个数据类型是等效的,可以相互转化,通常sockaddr_in数据类型使用更为方便。在建立sockaddr或sockaddr_in后,就可以对该socket进行适当的操作了。嵌入式系统及其应用重庆大学电气工程学院嵌入式系统及其应用通信协议类型族可选的常见值:通信协议类型族可选的常见值:重庆大学电气工程学院7.2.2socket网络编程示例网络编

24、程示例 嵌入式系统及其应用重庆大学电气工程学院1、程序流程、程序流程利用利用Socket方式进行数据通信与传输,有如下步骤:方式进行数据通信与传输,有如下步骤:(1)创建服务端)创建服务端socket,绑定建立连接的端口。,绑定建立连接的端口。(2)服务端程序在一个端口处于阻塞状态,等待客户机的)服务端程序在一个端口处于阻塞状态,等待客户机的连接。连接。(3)创建客户端)创建客户端socket对象,绑定主机名称或对象,绑定主机名称或IP地址,指地址,指定连接端口号。定连接端口号。(4)客户机)客户机Socket发起连接请求。发起连接请求。(5)建立连接。)建立连接。(6)利用)利用send/s

25、endto和和recv/recvfrom进行数据传输。进行数据传输。(7)关闭)关闭socket。 重庆大学电气工程学院嵌入式系统及其应用2、服务端程序、服务端程序server.c (1)首先,需要创建一个用于通讯的)首先,需要创建一个用于通讯的TCP协议的协议的socked套接字描述符。套接字描述符。 sockfd = socket(AF_INET,SOCK_STREAM,0) ; printf(socket Success!, sockfd = %d n,sockfd); 嵌入式系统及其应用重庆大学电气工程学院 (2)然后,在服务器端初始化)然后,在服务器端初始化sockaddr结构体,设

26、定套接字端口号:结构体,设定套接字端口号: my_addr.sin_family = AF_INET ; my_addr.sin_port = htons(4321) ; my_addr.sin_addr.s_addr = INADDR_ANY ; bzero(&(my_addr.sin_zero),8) ;嵌入式系统及其应用重庆大学电气工程学院 (3)将定义的)将定义的sockaddr结构体与结构体与socked套接字描述符进行绑定。套接字描述符进行绑定。 bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sock

27、addr) ; 嵌入式系统及其应用重庆大学电气工程学院 (4)调用)调用listen函数使函数使socked套接字成为套接字成为一个监听套接字。它与下一步骤的一个监听套接字。它与下一步骤的accept函数共同完成对套接字端口的监听。函数共同完成对套接字端口的监听。 listen(sockfd, 10) ;嵌入式系统及其应用重庆大学电气工程学院 (5)调用)调用accept函数监听套接字端口,等函数监听套接字端口,等待客户端的连接。一旦建立连接,将产生待客户端的连接。一旦建立连接,将产生一个全新的套接字。一个全新的套接字。 new_fd = accept(sockfd, (struct sock

28、addr *)&their_addr, &sin_size) ; 嵌入式系统及其应用重庆大学电气工程学院 (6)处理客户端的会话请求。将接收到的)处理客户端的会话请求。将接收到的数据存放到字符型数组数据存放到字符型数组buff中。中。 /读取客户端发来的信息读取客户端发来的信息 numbytes = recv(new_fd, buff, strlen(buff), 0) ; /向客户端发送信息向客户端发送信息 send(sockfd, Hello! I am Server., 19, 0) ;嵌入式系统及其应用重庆大学电气工程学院 (7)终止连接。通信结束则断开连接。)终止连接

29、。通信结束则断开连接。 close(sockfd);嵌入式系统及其应用重庆大学电气工程学院3、客户端程序、客户端程序client.c (1)和服务器的步骤一样)和服务器的步骤一样,首先需要创建一首先需要创建一个个socked套接字描述符。套接字描述符。 sockfd = socket(AF_INET,SOCK_STREAM,0) 嵌入式系统及其应用重庆大学电气工程学院 (2)然后,在客户端初始化)然后,在客户端初始化sockaddr结结构体,并调用函数构体,并调用函数gethostbyname( )获取获取从命令行输入的服务器从命令行输入的服务器IP地址,设定与服地址,设定与服务器程序相同的端

30、口号(比如,服务器的务器程序相同的端口号(比如,服务器的端口号是端口号是4321,则这里也必须设为,则这里也必须设为4321) 重庆大学电气工程学院嵌入式系统及其应用struct hostent *he; he = gethostbyname(argv1); /转换主机名或IP地址嵌入式系统及其应用重庆大学电气工程学院their_addr.sin_family = AF_INET; their_addr.sin_port = htons(4321); their_addr.sin_addr = *(struct in_addr *)he-h_addr); bzero(&(their_a

31、ddr.sin_zero),8); (3) 调用调用connect函数来连接服务器。函数来连接服务器。 connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr); (4) 发送或者接收数据,一般使用发送或者接收数据,一般使用send和和recv函数调用来实现(与服务器程序相函数调用来实现(与服务器程序相同)。同)。 (5) 终止连接(与服务器程序相同)。终止连接(与服务器程序相同)。 嵌入式系统及其应用重庆大学电气工程学院EXTRA_LIBS += -lpthreadCC = arm-linux-gccE

32、XEC = ./server OBJS = server.oall: $(EXEC)$(EXEC): $(OBJS)$(CC) $(LDFLAGS) -o $ $(OBJS) $(EXTRA_LIBS)install:$(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)clean:-rm -f $(EXEC) *.elf *.gdb *.o嵌入式系统及其应用重庆大学电气工程学院EXTRA_LIBS += -lpthreadCC=gccEXEC = ./clientOBJS = client.o all: $(EXEC)$(EXEC): $(OBJS)$(CC) $(LDF

33、LAGS) -o $ $(OBJS) $(EXTRA_LIBS)install:$(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)clean:-rm -f $(EXEC) *.elf *.gdb *.o嵌入式系统及其应用重庆大学电气工程学院 rootlocalhost client# make嵌入式系统及其应用重庆大学电气工程学院 rootlocalhost server# make rootlocalhost server# make clean rootLinux server# ./serverSocket Success! Sockfd = 3Bind Succ

34、ess!Listening.Hello! Client connect rootlocal client# ./client 9result: Welcome, This is Server.嵌入式系统及其应用重庆大学电气工程学院 在实际情况中,人们往往遇到多个客户端连接服务器端的情况。由于之前介绍的如由于之前介绍的如connect、recv、send都是阻塞性函数,若资源没有准备都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入睡眠状态,这样好,则调用该函数的进程将进入睡眠状态,这样就无法处理就无法处理I/O多路复用的情况了多路复用的情况了。解决这个问题需要用到

35、其它的函数,如:fcntl和select。嵌入式系统及其应用重庆大学电气工程学院7.3嵌入式系统的嵌入式系统的Web服务器程序设计服务器程序设计 嵌入式系统及其应用重庆大学电气工程学院7.3.1Web服务器服务器1. WEB服务器的工作原理服务器的工作原理 只要在嵌入式设备中有一个微型Web服务器, 就可以使用任意一种Web浏览器接收和发送信息。这种基于Internet的方式使得我们可以在世界任何一个地方都能够控制它,只要它连入Internet 。嵌入式系统及其应用最基本的最基本的WEB服务器采用服务器采用HTTP协议(超文本传输协议)协议(超文本传输协议)可以以文本、超文本、图形、音频、视频

36、形式传输数据可以以文本、超文本、图形、音频、视频形式传输数据使用使用HTTP协议可以在客户端和服务器之间以非常简单协议可以在客户端和服务器之间以非常简单的方式传输数据,客户端发出请求,服务器返回响应的方式传输数据,客户端发出请求,服务器返回响应给客户端。给客户端。嵌入式系统及其应用重庆大学电气工程学院对于嵌入式Web服务器的研究和应用,是很有意义的。它为我们远程管理、控制和监测各种各样设备提供了一个很好的途径。嵌入式系统及其应用重庆大学电气工程学院7.3.2Web服务器的程序设计服务器的程序设计嵌入式系统及其应用重庆大学电气工程学院1、建立、建立Web服务器的主要步骤服务器的主要步骤 嵌入式系

37、统及其应用重庆大学电气工程学院(1)建立客户端与服务器端的)建立客户端与服务器端的socket套接字通信套接字通信 服务器端建立基于服务器端建立基于TCP服务的服务的socket套接字通信,一般需套接字通信,一般需要经过要经过3个过程:个过程: 创建一个创建一个socket套接字描述符:套接字描述符: sockfd = socket(AF_INET, SOCK_STREAM, 0); 给给socket绑定一个地址和端口号:绑定一个地址和端口号: bind(sockfd, (struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr

38、); 监听套接字端口,等待连接请求,一旦有接入,则创建一监听套接字端口,等待连接请求,一旦有接入,则创建一个新套接字描述符个新套接字描述符fd: listen(sockfd, 8*3); fd = accept(sockfd, (void *)&ec, &len); 嵌入式系统及其应用重庆大学电气工程学院(2)客户端连接处理)客户端连接处理 调用函数调用函数HandleConnect( )处理客户端的处理客户端的连接请求。在这个函数中,我们用连接请求。在这个函数中,我们用fdopen( )函数将套接字描述符函数将套接字描述符fd转为文件转为文件指针,再用指针,再用fgets(

39、)函数将其内容存放到缓函数将其内容存放到缓冲区中,以便对其请求进行分析处理。冲区中,以便对其请求进行分析处理。 嵌入式系统及其应用重庆大学电气工程学院 FILE *fdopen(int fd, const char *mode)嵌入式系统及其应用重庆大学电气工程学院会将参数fd的文件描述符,转换为对应的文件指针后返回。参数mode字符串则代表着文件指针的流形态,此形态必须和原先文件描述符读写模式相同。mode有下列几种形态字符串: r:读操作,打开文本文件,流被定位于文件开始处。 r+:读写操作,打开文本文件,流被定位于文件开始处。 w:写操作,创建文本文件,或者将已经存在的文件内容覆盖。流被

40、定位于文件开始处。 w+:读写操作,打开文件,若文件不存在,则会建立该文件,否则覆盖该文件,流被定位于文件开始处。 a:追加操作(在文件尾部写操作),打开文件,若文件不存在,则会建立该文件,流被定位于文件末尾处。 a+:追加操作(在文件尾部写操作),打开文件,若文件不存在,则会建立该文件, 读文件的初始位置是文件的开始处,但是写文件总是被追加到文件末尾。范例:范例: #include main() FILE * fp =fdopen(1,”w+”); fprintf(fp,”%sn”,”hello!”); fclose(fp); 执行结果:执行结果: hello!嵌入式系统及其应用重庆大学电气

41、工程学院 char *fgets(char *string, int n, FILE *stream)fgets()函数的功能是从流中读取一字符串:嵌入式系统及其应用重庆大学电气工程学院string:结果数据的首地址n-1:一次读入数据块的长度,其默认值为1k,即1024stream:是文件指针嵌入式系统及其应用重庆大学电气工程学院例:如果一个文件的当前位置的文本如下 Love ,I Have 如果用 fgets(str1,4,file1); 则执行后str1=Lov,读取了4-1=3个字符, 而如果用 fgets(str1,23,file1); 则执行str1=Love ,I Have,读取

42、了一行(包括行尾的n,并自动加上字符串结束符0)。调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加0,并以str作为函数值返回。(3)分析和处理客户请求)分析和处理客户请求 在函数在函数ParseReq( )中解析和处理客户请求。中解析和处理客户请求。主要是去除掉空白符(空格、换页、换行、主要是去除掉空白符(空格、换页、换行、回车、制表符等)。回车、制表符等)。 嵌入式系统及其应用重庆大学电气工程学院int ParseReq(FILE *f, char *r) char *bp; char * c;#ifdef DEBUG printf(“req is %sn”,

43、 r);#endif while(*(+r) != ); /*判断是否为空格*/ while(isspace(*r) r+;/*判断是否为空白符(空格、换页、换行、回车、制表 符等)*/ while (*r = /)r+; bp = r; while(*r & (*(r) != ) & (*(r) != ?) r+; *r = 0; c = bp; DoHTML(f, c); return 0;嵌入式系统及其应用重庆大学电气工程学院int HandleConnect(int fd) FILE *f; char buf160; f = fdopen(fd,a+); setbuf(

44、f, 0); /设置(清空)缓冲区 fgets(buf, 150, f);#ifdef DEBUG printf(buf = %sn, buf);#endif ParseReq(f, buf); fclose(f); return 1;嵌入式系统及其应用重庆大学电气工程学院(4)复制一个)复制一个Web文档副本发文档副本发送给客户送给客户 Web服务器根据解析处理,将客户请求的服务器根据解析处理,将客户请求的内容,复制成一个文档副本,以内容,复制成一个文档副本,以HTML文件文件方式发送给用户。方式发送给用户。 嵌入式系统及其应用重庆大学电气工程学院/* 发送HTML文件内容 */int Do

45、HTML(FILE *f, char *name) char *buf; FILE *infile; infile = fopen(name,r); copy(infile,f); /* prints the page */ fclose(infile); return 0;嵌入式系统及其应用重庆大学电气工程学院/* 复制一个Web文档副本 */int copy(FILE *read_f, FILE *write_f) int n; int wrote; n = fread(copybuf,1,sizeof(copybuf),read_f); wrote = fwrite(copybuf,n,

46、1,write_f); return 0;嵌入式系统及其应用重庆大学电气工程学院一个简易的一个简易的Web服务器程序服务器程序int main(int argc, char *argv) int fd, sockfd; int len; volatile int true = 1; struct sockaddr_in ec; struct sockaddr_in server_sockaddr; pthread_t th_key;/ void * retval; printf(starting httpd.n); printf(press q to quit.n);sockfd = sock

47、et(AF_INET, SOCK_STREAM, IPPROTO_TCP);setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&true,sizeof(true); server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(SERVER_PORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd, (struct sockaddr *)&server_soc

48、kaddr,sizeof(server_sockaddr); listen(sockfd, 8*3); /* Arbitrary, 8 files/page, 3 clients */ /接受键盘输入,以便按“Q”键能退出服务程序 pthread_create(&th_key, NULL, key, 0); printf(wait for connection.n); while (1) len = sizeof(ec); if(fd = accept(sockfd, (void *)&ec, &len) = -1) exit(5); close(sockfd); Ha

49、ndleConnect(fd); 嵌入式系统及其应用重庆大学电气工程学院web服务器的系统分析与程序设计服务器的系统分析与程序设计嵌入式系统及其应用重庆大学电气工程学院 功能需求功能需求 数据流图数据流图 系统结构图系统结构图 接口程序设计接口程序设计 模块程序设计模块程序设计功能需求功能需求 获取服务器当前目录文件列表获取服务器当前目录文件列表 获取指定文件获取指定文件 获取获取HTMLHTML类型文件类型文件 获取纯文本文件获取纯文本文件 获取获取JPGJPG图像文件图像文件 获取获取GIFGIF图像文件图像文件 解析用户请求解析用户请求嵌入式系统及其应用重庆大学电气工程学院数据流程图数据

50、流程图 客户请求获取服 务器资源 解析客户请求字 符串 发送HTTP协议头 发送资源数据 侦听客户请求 客户计算机 读取客户请求资 源嵌入式系统及其应用重庆大学电气工程学院系统结构图系统结构图 主程序MAIN 1、环境设置 2、建立侦听SOCKET及客户连接处 理调用主循环 客户连接处理 解析客户请求HTTP协议头 发送HTTP协议数据头 发送GIF文件 发送文本文件 发送JPG文件 发送HTML文件 发送当前目录信息重庆大学电气工程学院嵌入式系统及其应用客户连接处理过程客户连接处理过程 客户请求获取服 务器资源 解析客户请求字 符串 发送HTTP协议头 发送资源数据 侦听客户请求 客户计算机

51、 读取客户请求资 源嵌入式系统及其应用重庆大学电气工程学院主程序设计主程序设计 功能说明功能说明系统的总入口,也是系统的主系统的总入口,也是系统的主控制函数。完成如下功能:控制函数。完成如下功能:建立环境设置。设置信号处理方式。建立侦听TCP流方式SOCKET并绑定端口。建立连接侦听及客户连接处理调用主循环。 设置信号处理 句柄 进入根目录 命令行处理 建立TCP流SOCKET 绑定监听端口 设置允许客户 连接数量 侦听客户连接 请求 客户连接请求 处理嵌入式系统及其应用重庆大学电气工程学院客户连接处理程序客户连接处理程序 功能说明功能说明用于初步处理客用于初步处理客户的连接请求,户的连接请求

52、,并将请求信息传并将请求信息传递给客户请求解递给客户请求解析函数处理。析函数处理。 打开文件描述字, 并建立文件描述符 读取连接信息 获取Refferer字段信息 赋值给Refferer全局变量 获取content_length字段信息 调用客户请求 解析模块 关闭文件流嵌入式系统及其应用客户请求解析处理程序客户请求解析处理程序 对客户的请求字符 串进行空格处理 发送当前目录 的INDEX.HTML文件 请求目录下 的index.html是否存在? 发送当前目录 信息 是否请求目录? 是 是JPG或JPEG 文件 判断客户请求 文件类型 否 是GIF图像文件 是HTML文件 是纯文本文件 发送

53、协议头: Content-type: image/jpeg 请求资源是否存 在? 是 回应请求资源 不存在。 否 发送协议头: Content-type: image/gif 发送协议头: Content-type: text/html 发送协议头: Content-type: text/plain 发送文件数据 是 否 功能说明功能说明用于解析客户的用于解析客户的请求,并根据请请求,并根据请求信息调用相应求信息调用相应的函数进行请求的函数进行请求处理处理。嵌入式系统及其应用重庆大学电气工程学院发送发送HTTP协议数据头程序协议数据头程序 功能说明功能说明 根据参数的不同,发送不同的HTTP协

54、议头信息。算法算法 函数定义为:int PrintHeader(FILE *f, int content_type) 发送请求成功信息:HTTP/1.0 200 OK。 根据文档类型发送相应的信息 发送服务器信息 发送文件嵌入式系统及其应用重庆大学电气工程学院接口程序设计接口程序设计 客户连接处理客户连接处理 函数名:函数名:intint HandleConnectHandleConnect( (intint fdfd) ) 解析客户请求解析客户请求 函数名:函数名:intint ParseReqParseReq(FILE (FILE * *f, char f, char * *r) r) 发

55、送发送HTTPHTTP协议数据头协议数据头 函数名:函数名:intint PrintHeaderPrintHeader(FILE (FILE * *f, f, intint content_typecontent_type) ) 发送当前目录文件列表信息发送当前目录文件列表信息 函数名:函数名:intint DoDirDoDir(FILE (FILE * *f, char f, char * *name)name)嵌入式系统及其应用重庆大学电气工程学院重庆大学电气工程学院嵌入式系统及其应用 发送发送HTMLHTML文件内容文件内容 函数名:函数名:intint DoHTMLDoHTML(FIL

56、E (FILE * *f, char f, char * *name)name) 发送纯文本(发送纯文本(TXTTXT)文件内容)文件内容 函数名:函数名:intint DoTextDoText(FILE (FILE * *f, char f, char * *name)name) 发送发送JpegJpeg图像文件内容图像文件内容 函数名:函数名:intint DoJpegDoJpeg(FILE (FILE * *f, char f, char * *name)name) 发送发送GIFGIF图像文件内容图像文件内容 函数名:函数名:intint DoGifDoGif(FILE (FILE *

57、 *f, char f, char * *name)name)简单简单web服务器的源程序服务器的源程序/*头文件头文件*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include pthread.h嵌入式系统及其应用重庆大学电气工程学院int KEY_QUIT=0;int TIMEOUT=30; /定义超时时间为定义超时时间为30秒秒 #ifndef O_BINARY#define O_BINARY

58、0#endif char referrer128;int content_length; #define SERVER_PORT 80 /使用端口使用端口80重庆大学电气工程学院嵌入式系统及其应用int PrintHeader(FILE *f, int content_type) /发送发送HTTP文件头函数文件头函数 alarm(TIMEOUT); /超时报警处理超时报警处理 fprintf(f,HTTP/1.0 200 OKn); switch (content_type) /选定的文件的类型信息选定的文件的类型信息 case t: fprintf(f,Content-type: text

59、/plainn); break; case g: fprintf(f,Content-type: image/gifn); break; case j: fprintf(f,Content-type: image/jpegn); break; case h: fprintf(f,Content-type: text/htmln); break; fprintf(f,Server: uClinux-httpd 0.2.2n); fprintf(f,Expires: 0n); fprintf(f,n); alarm(0);/停止超时报警停止超时报警 return(0);int DoJpeg(FIL

60、E *f, char *name) /发送发送JPEG文件函数文件函数 char *buf; FILE * infile; int count; if (!(infile = fopen(name, r) alarm(TIMEOUT); /超时报警处理超时报警处理 fprintf(stderr, Unable to open JPEG file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,j); /发送发送JPEGJPEG类类HTTPHTTP协议数据头协议数据头 copy(infile,f); /发送发送JPEG文件文件 alarm(TIMEOUT); fclose(infile); alarm(0); return 0;int DoGif(

温馨提示

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

评论

0/150

提交评论