嵌入式课程设计课题:Ftp服务器一、程序介绍本程序实现一个FTP文件传输功能,分为服务器端和客户端两部分。完成文件在客户端和服务器端的传送。程序将源文件复制到目的目录,其中服务器端和客户端都可以作为源文件端,实现FTP的下载与上传功能。如果目的端已经存在该文件,则覆盖原始文件。嵌入式课程设计131040048张梦迪1二、网络编程原理linux下进行网络编程的基础是TCP/IP协议族,虽然TCP/IP名称只包含了两个协议,但实际上,TCP/IP是一个庞大的协议族,它包括了各个层次上的众多协议(见图一):图1TCP/IP协议族·ARP:用于获得同一物理网络中的硬件主机地址。·MPLS:多协议标签协议,是很有发展前景的下一代网络协议。·IP:负责在主机和网络之间寻址和路由数据包。·ICMP:用于发送报告有关数据包的传送错误的协议。·IGMP:被IP主机用来向本地多路广播路由器报告主机组成员的协议。·TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。并适用于要求得到响应的应用程序。·UDP:提供了无连接通信,且不对传送包进行可靠的保证。适合于一次传输少量数据,可靠性则由应用层来负责。1.TCP同其他任何协议栈一样,TCP向相邻的高层提供服务。因为TCP的上一层就是应用层,因此,TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递。应用程序通过编程调用TCP并使用TCP服务,提供需要准备发送的数据,用来区分接收数据应用的目的地址和端口号。通常应用程序通过打开一个socket来使用TCP服务,TCP管理到其他socket的数据传递。可以说,通过IP的源/目的可以惟一地区分网络中两个设备的关联,通过socket的源/目的可以惟一地区分网络中两个应用程序的关联。TCP对话通过三次握手来初始化的。三次握手的目的是使数据段的发送和接收同步,告诉其他主机其一次可接收的数据量,并建立虚连接。·初始化主机通过一个同步标志置位的数据段发出会话请求。·接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。嵌入式课程设计131040048张梦迪2·请求主机再回送一个数据段,并带有确认顺序号和确认号。TCP实体所采用的基本协议是滑动窗口协议。当发送方传送一个数据报时,它将启动计时器。当该数据报到达目的地后,接收方的TCP实体向回发送一个数据报,其中包含有一个确认序号,它意思是希望收到的下一个数据报的顺序号。如果发送方的定时器在确认信息到达之前超时,那么发送方会重发该数据报。2.UDPUDP即用户数据报协议,它是一种无连接协议,因此不需要像TCP那样通过三次握手来建立一个连接。同时,一个UDP应用可同时作为应用的客户或服务器方。由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是在网络质量越来越高的今天,UDP的应用得到了大大的增强。它比TCP协议更为高效,也能更好地解决实时性的问题。如今,包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都使用UDP协议。3.协议的选择协议的选择应该考虑到以下3个方面。(1)对数据可靠性的要求对数据要求高可靠性的应用需选择TCP协议,如验证、密码字段的传送都是不允许出错的,而对数据的可靠性要求不那么高的应用可选择UDP传送。(2)应用的实时性由于TCP协议在传送过程中要进行三次握手、重传确认等手段来保证数据传输的可靠性。使用TCP协议会有较大的时延,因此不适合对实时性要求较高的应用,如VOIP、视频监控等。相反,UDP协议则在这些应用中能发挥很好的作用。(3)网络的可靠性由于TCP协议的提出主要是解决网络的可靠性问题,它通过各种机制来减少错误发生的概率。因此,在网络状况不是很好的情况下需选用TCP协议(如在广域网等情况),但是若在网络状况很好的情况下(如局域网等)就不需要再采用TCP协议,选择UDP协议来减少网络负荷。三、socket编程1.socket定义在Linux中的网络编程是通过socket接口来进行的。人们常说的socket接口是一种特殊的I/O,它也是一种文件描述符。每一个socket都用一个半相关描述{协议,本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议,本地地址、本地端口、远程地址、远程端口}。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过socket来实现的。2.socket类型常见的socket有3种类型如下。(1)流式socket(SOCK_STREAM)流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。(2)数据报socket(SOCK_DGRAM)数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,嵌入式课程设计131040048张梦迪3是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。(3)原始socket原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。3.socket操作需要用到的头文件#includestdio.h#includestring.h#includeunistd.h#includeregex.h#includectype.h#includesys/socket.h#includesys/stat.h#includenetinet/in.h#includearpa/inet.h#includestdlib.h#includefcntl.h#includesys/stat.h#includeerrno.h#includemy_rw.h//自己定义的读写函数文件4.socket基础编程进行socket编程的基本函数有socket、bind、listen、accept、write、read这几个,其中对于客户端和服务器端以及TCP和UDP的操作流程都有所区别.·socket:该函数用于建立一个socket连接,可指定socket类型等信息。在建立了socket连接之后,可对socketadd或sockaddr_in进行初始化,以保存所建立的socket信息。·bind:该函数是用于将本地IP地址绑定端口号的,若绑定其他地址则不能成功。另外,它主要用于TCP的连接,而在UDP的连接中则无必要。·connect:该函数在TCP中是用于bind的之后的client端,用于与服务器端建立连接,而在UDP中由于没有了bind函数,因此用connect有点类似bind函数的作用。·write和read:这两个函数用于接收和发送数据,可以用在TCP中,也可以用在UDP中。当用在UDP时,可以在connect函数建立连接之后再用。四、程序设计1、客户端客户端程序的主要任务有以下3个:(1)、分析用户输入的命令。(2)、根据命令向服务器发出请求(3)、接受服务器返回请求的结果客户端为用户提供了8中命令:(1)、get:从服务器下载文件(2)、put:上传文件到服务器(3)、cd:进入客户端的目录(4)、!cd:进入服务器端的目录(5)、ls:列出客户端当前目录的内容嵌入式课程设计131040048张梦迪4(6)、!ls:列出服务器端当前目录的内容(7)、connect:连接到服务器(8)、bye:退出程序客户端程序从标准输入中读取到一个字符串,其中包括命令、参数1和参数2,由空格分开。客户端程序需要拆分该字符串,将空格去掉,并且将命令和参数存储起来,以便使用。当分析命令结束后,客户端需要向服务器发出请求。大部分用户输入的命令都对应一个请求,只有cd命令、ls命令是客户端独立完成的命令,不许要同服务器进行通信,因此不许要要建立连接。其余命令都需要和服务器建立连接,将请求发送给服务器,等待服务器返回的结果。除了connect命令发出的请求外,每个命令发出的请求都有一个请求码。这个代码告知服务器应当如何处理这次请求。也就是说这是客户端发送给服务器端的命令,服务器程序会对其进行解析。用户输入的命令对应的请求getGETputPUTcd不需要与服务器端通信,无请求!cdCDls不需要与服务器端通信,无请求!lsLSconnect发出连接请求,不许要额外的请求byeBYE完成了前两个任务之后,客户端需要等待服务器返回的结果。在正确接受到结果后,又有两种处理方法:写入文件和屏幕输出。对于get命令来讲,需要将服务器传送过来的文件内容写到指定的目的文件中,对于!ls命令来讲,应当将服务器传送过来的当前目录的内容列出在屏幕上。而对于put命令来说之需要接受服务器的确认代码,保证传输无误就可以了。2、服务器端程序的设计服务器端程序同样也有3个主要任务:(1)、分析请求代码。(2)、根据请求代码做相应的处理(3)、等待返回结果或者应答信息所不同的是服务器程序需要处理的请求编码要少于客户端程序的命令,如下表所示列出了服务器对于每一个请求代码所做的处理请求代码对应的处理GET向客户端传输文件PUT接收客户端的文件CD进入目录LS将当前目录内容传输给客户端BYE断开连接3、通信协议与服务器模型本程序的通信协议分为两种。对于get命令和!ls命令这些需要传输文件内容的命令,采用四次握手的通信协议.以get命令为例:get命令首先发出GET请求,服务器接到请求后发送请求文件的长度或者错误应答码,接受到文件长度后客户端程序发送RDY应答信息,服嵌入式课程设计131040048张梦迪5务器端开始传输文件内容。对与!Cd命令这种不许要传输文件内容的命令采用两次握手的通信协议。以!cd命令距离:!cd命令首先发出CD请求,服务器接受到请求后发送应答信息或者出错信息。由于客户端程序是交互式的,因此本程序采用多进程并发服务器模型。4、主要功能流程图客户端主函数流程图客户端get函数流程图进入命令处理流程程序正常结束等待用户输入命令拆分命令输入命令是否有效是输出提示信息提示重新输入命令否输入命令为bye处理源路径与目的路径判断路径进入get函数传输的是文件夹获得文件夹内文件目录,嵌入式课程设计131040048张梦迪6服务器端主函数流程图服务器端GET请求处理流程图调用config函数创建监听套接字接收到连接,创建子进程,关闭套接字接收并识别客户端请求进入请求处理流程子进程退出打开文件识别为GET请求嵌入式课程设计131040048张梦迪7五、软件测试结果1、编译并运行程序2、在/root/vi/x/client路径下新建tufei.txt以及文件夹tufei(内有待发送的文件),等待发送至服务器,并在/root/vi/x/server路径下新建zhang.txt以及文件夹zhang(内有待发送的文件),等待发送至客户端。嵌入式课程设计131040048张梦迪83、使用connect命令连接至服务器,测试get命令,从服务器下载zhang.txt以及文件夹zhang4、测试put命令将,tufei.txt以及文件夹tufei发送至服务器6、get与put命令的运行结果7、运行ls命令嵌入式课程设计131040048张梦迪9嵌入式课程设计131040048张梦迪附录2:源程序1、my_rwmy_rw.h#ifndef_MY_RW_H#define_MY_RW_Hexternssize_tmy_read(intfd,void*buffer,size_tlength);externssize_tmy_write(intfd,void*buffer,size_tlength);#endifmy_rw.c#includeerrno.h#includefcntl.h#includeunistd.h#includemy_rw.h