课程设计课程名称______________________ 题目名称______________________ 学生学院______________________ 专业班级______________________ 学号______________________ 学生姓名______________________ 指导教师______________________200 年月日摘要本课程设计说明书主要说明了在windows下如何用c语言编写设计ftp服务器和客户端的基本方法及其实现。
包含了TCP/IP协议基本通信原理,Winsock编程基本原理以及ftp工作原理。
正文部分是程序设计的具体内容及其源代码,最后是报告反思及总结。
关键词:TCP/IP,Winsock,ftp摘要 (1)1.绪论 (3)1.1设计目的 (3)1.2设计要求 (3)1.21计算机网络实验环境建立在TCP/IP 网络体系结构之上。
(3)1.22具体要求 (3)1.3设计准备 (4)1.4设计方案 (4)2.开发环境介绍 (5)3.相关原理分析了解 (5)3.1TCP/IP原理 (5)3.11网络层协议 (5)3.12应用层协议 (5)3.2Winsock编程原理 (6)3.23Winsock编程模型: (6)数据报套接字编程模型 (7)Winsock I/O模型 (7)3.3TP工作原理 (7)3.4Winsock API基本函数介绍 (8)(1)WSAStartup()函数和WSACleanup()函数 (8)(2)socket()函数 (8)(3)bind( ) 函数 (9)(4)listen( )函数 (9)(5)accept( )函数 (9)(6)connect( )函数 (9)(7)closesocket( )函数 (9)4.总体设计 (10)4.1了解Winsock与操作系统的关系 (10)4.2实现功能流程图 (11)5.详细设计 (11)5.1文件传输源程序代码 (11)(1)客户端client程序代码 (11)(2)、服务器端server程序代码 (22)六、系统实现步骤 (33)七、总结结论(心得体会) (35)参考文献: (36)1.绪论1.1设计目的本设计旨在利用原始socket简单实现FTP(File Transfer Protocol,文件传输协议)的客户端和服务器端程序,能够实现get、put、pwd、dir、cd等基本交互命令。
通过完成此设计,了解Winsock API函数调用方法和一般网络应用程序的编程方法,理解FTP协议,掌握C语言设计FTP协议软件的基本技术,为将来开发其他通信协议软件打下坚实基础。
1.2设计要求1.21计算机网络实验环境建立在TCP/IP 网络体系结构之上。
各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。
实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。
本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。
1.22具体要求用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd :改变远方当前目录:显示你提供的命令quit :退出返回1.3设计准备装有Windows操作系统的PC机、Visual C++ 6.0编译器或VS2010编译器1.4设计方案1.服务器端调用socket的accept()方法,等待客户端联接。
2.客户端发送需要从服务端获得的文件夹路径给服务器端。
3.服务器端根据客户端发来的路径遍历整个路径下的文件及文件夹,并将需要传送到文件记录全路径记录到一个String类型的数组中,并将文件的个数发送给客户端。
4.客户端接收服务器端发来的文件个数,并向服务器端发送关闭联接请求,并关闭客户端连接。
5.服务器端收取关闭连接请求,将socket关闭,进入传输文件循环中。
6.服务器端调用socket的accept()方法,等待客户端联接。
7.客户端根据刚才取得的要传输的文件数,进行循环获取文件,记得每次取完文件要关闭socket连接,这样就不会将多个文件写入到同一个文件中。
2.开发环境介绍VC6.0编程环境:首先建一个工程,填入文件名,点击下一步,出现要创建的文件夹名,填上点击下一步,完成建立工程。
然后再点击新建菜单,新建一个C/C++source文件,点击下一步,完成建立过程,然后在窗口中写入源代码,执行即可。
3.相关原理分析了解3.1TCP/IP原理TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。
它们分别是传输控制协议和互连网协议。
这两个协议属于众多的TCP/IP协议组中的一部分。
TCP/IP协议组中的协议保证Internet上数据的传输,提供了几乎现在上网所用到的所有服务。
这些服务包括:电子邮件的传输,文件传输,新闻组的发布,访问万维网在TCP/IP协议组分两种协议:网络层的协议和应用层的协议3.11网络层协议:网络层协议管理离散的计算机间的数据传输。
这些协议用户注意不到,是在系统表层以下工作的。
比如,IP协议为用户和远程计算机提供了信息包的传输方法。
它是在许多信息的基础上工作的,比如说是机器的IP地址。
在机器IP地址和其它信息的基础上,IP确保信息包能正确地到达目的机器。
通过这一过程,IP和其它网络层的协议共同用于数据传输。
如果没有网络工具,用户就看不到在系统里工作的IP。
3.12应用层协议:相反地,应用层协议用户是可以看得到的。
比如,文件传输协议(FTP)用户是看得到的。
用户为了传输一个文件请求一个和其它计算机的连接,连接建立后,就开始传输文件。
在传输时,用户和远程计算机的交换的一部分是能看到的。
TCP/IP通过使用协议栈工作。
这个栈是所有用来在两台机器间完成一个传输的所有协议的几个集合。
(这也就是一个通路,数据通过它从一台机器到另一台机器。
)栈分成层,与这里有关的是五个层。
栈的每一层都能从相邻的层中接收或发送数据。
每一层都与许多协议相联系。
在栈的每一层,这些协议都在起作用。
本章的下一部分将分析这些服务,以及它们在栈中是如何联系的。
同时也分析一下它们的功能,它们提供的服务和与安全性的关系。
3.2Winsock编程原理通过Winsock可实现点对点或广播通信程序,实际这两者之间的区别不大,编程时其程序流程所用代码几乎相同,不同的地方在于目标地址选择的不同。
由于Winsock的服务是以动态链接库Winsock DLL形式实现的,因此先调用1、WSAStartup对Winsock DLL进行初始化2、应用程序关闭套接字后,还应调用WSACleanup终止对Winsock DLL的使用3.23Winsock编程模型:流套接字编程模型:1 .服务器进程创建套接字socket2 .将本地地址绑定到所创建的套接字bind3 .将套接字置入监听模式并准备接受连接请求listen,accept4 .客户进程调用socket函数创建客户端套接字5 .客户向服务进程发出连接请求connect6 .当服务器接收到客户请求,阻塞的accept进程,生成新一个新的套接字与客户套接字建立连接,并向客户端返回接受信号7 .客户套接字收到服务器接受信号,表示连接建立成功,开始用send, recv进行收发数据8 关闭套接字先用shutdown 再用closesocket数据报套接字编程模型:②服务器用socket创建,用bind绑定③用readfrom从网络上接收,收不到进入阻塞④客户端也用socket , bind绑定⑤客户端用sendto发送数据⑥服务器端接收数据,用sendto进行响应⑥数据发送完两者调用closesocket进行套接字释放Winsock I/O模型:阻塞模式:一直等待下去,不会立即返回非阻塞模式:无论何都会返回关交出程序的控制权3.3TP工作原理文件传输协议是从一个系统向另一个系统传递文件的标准方法。
它的目标在RFC 0765中写得很清楚。
FTP的目标1)促进文件和程序的共享2)鼓励间接和含蓄的使用远程计算机3)使用户不必面对主机间使用的不同的文件存储系统4)有效和可靠地传输文件。
FTP,尽管用户可以直接通过终端来使用,是设计成让别的程序使用的。
FTP文件传输应用在客户/服务环境。
请求机器启动一个FTP客户端软件。
这就给目标文件服务器发出了一个请求。
典型地,这个要求被送到端口21。
一个连接建立起来后,目标文件服务器必须运行一个FTP服务软件。
FTPD是标准的FTP服务daemon。
它的功能很简单:回复inetd收到的连接请求,并满足这些要传输文件的请求。
这个daemon在许多发行版的UNIX中是个标准。
FTPD等待一个连接请求。
当这样的一个请求到达时,FTPD请求用户登录。
用户提供它的合法的登录名和口令或匿名登录。
一旦登录成功,用户可以下载文件了。
在某些情况下,如果服务器的安全允许,用户可以上载文件。
3.4Winsock API基本函数介绍(1)WSAStartup()函数和WSACleanup()函数由于Winsock 2提供的API服务是以动态链接库ws2_32.dll实现的,所以必须先调用WSAStartup() 函数对ws2_32.dll进行加载初始化,协商Winsock的版本支持,并分配必要的资源。
在应用程序关闭套接字后,还应调用WSACleanup( )函数来终止和卸载动态链接库ws2_32.dll,释放资源。
(2)socket()函数服务进程和客户进程在通信前必须创建各自的套接字,然后才能用相应的套接字进行发送、接收操作,实现数据的传输。
服务进程总是先于客户进程启动,服务进程和客户进程调用socket() 函数创建套接字。
(3)bind( ) 函数当用socket( )创建套接字后,它便存在于一个名字空间(地址族)中,但并未赋名。
bind ( )函数通过给一个未命名套接字分配一个本地名字(主机地址/端口号)来为套接字建立本地捆绑。
客户端一般隐式地向操作系统请求一个随机的未使用过的临时端口号,跟自己的IP地址一起,与所创建的套接字建立联系,由于该临时端口号客户端程序事先是不确定的,因此不显式地使用绑定函数。
(4)listen( )函数调用listen( )函数对服务器上套接字启动监听,即允许客户连接请求开始排队。
(5)accept( )函数服务器设置监听工作方式后,通过调用accept( ) 函数使套接字等待接受客户连接。