计算机课程设计报告_第1页
计算机课程设计报告_第2页
计算机课程设计报告_第3页
计算机课程设计报告_第4页
计算机课程设计报告_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、下载可编辑.专业.整理.课程设计课程名称题目名称学生学院专业班级学 号学生姓名指导教师200 年 月 日摘要本课程设计说明书主要说明了在 windows下如何用c语言编写设计ftp服务器和客户端的基本方法及其实现。包含了 TCP/IP协议基本通信原理,Winsock编程基本原理以及ftp工作原 理。正文部分是程序设计的具体内容及其源代码,最后是报告反思及总结。关键词:TCP/ipWinsock,ftp摘要1.绪论2设计目的2设计要求2计算机网络实验环境建立在TCP/IP网络体系结构之上。2具体要求 2设计准备1设计方案.开发环境介绍2.相关原理分析了解2TCP/IP 原理2网络层协议2应用层协

2、议23.2Winsock 编程原理 33.23Winsock编程模型:数据报套接字编程模型Winsock I/O 模型.43.3TP工作原理.43.4Winsock API基本函数介绍(1)WSAStartup ()函数和 WSACleanup ()函数(2)socket ()函数(3)bind()函数(4)listen()函数.6(5)accept()函数(6)connect。函数.6closesocket()函数.64.总体设计7.4.1 了解Winsock与操作系统的关系4.2实现功能流程图5.详细设计5.1文件传输源程序代码(1)客户端client程序代码(2)、服务器端server程

3、序代码19六、系统实现步骤30七、总结结论(心得体会)3233.绪 论设计目的本设计旨在利用原始socket简单实现FTP(File Transfer Protocol,文件传输协议)的客户端和 服务器端程序,能够实现get、put、pwd、dir、cd等基本交互命令。通过完成此设计,了解Winsock API函数调用方法和一般网络应用程序的编程方法,理解FTP协议,掌握C语言设计FTP协议软件的基本技术,为将来开发其他通信协议软件打下坚 实基础0设计要求计算机网络实验环境建立在TCP/IP网络体系结构之上。各计算机除了安装 TCP/IP软件外,还安装了 TCP/IP开发系统。实验室各计算机具

4、备 Windows环境中套接字socket的编程接口功能,可为用户提供全网范围的进程通信功能。 本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。具体要求用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server , 该程序应能实现下述命令功能:get:取远方的一个文件put :传给远方一个文件pwd :显示远主当前目录dir:列出远方当前目录cd :改变远方当前目录?:显示你提供的命令quit :退出返回计准备装有Windows操作系统的PC机、Visual C+ 6.0编译器或VS2010编译器计方案.服务器端调用socket的accept

5、 ()方法,等待客户端联接。.客户端发送需要从服务端获得的文件夹路径给服务器端。.服务器端根据客户端发来的路径遍历整个路径下的文件及文件夹,并将需要传送到文件记录全路径记录到一个String类型的数组中,并将文件的个数发送给客户端。.客户端接收服务器端发来的文件个数,并向服务器端发送关闭联接请求,并关闭客户 端连接。.服务器端收取关闭连接请求,将socket关闭,进入传输文件循环中。.服务器端调用socket的accept ()方法,等待客户端联接。.客户端根据刚才取得的要传输的文件数,进行循环获取文件,记得每次取完文件要关 闭socket连接,这样就不会将多个文件写入到同一个文件中。.开发环

6、境介绍VC6.0编程环境:首先建一个工程,填入文件名,点击下一步,出现要创建的文件夹名 填上点击下一步,完成建立工程。然后再点击新建菜单,新建一个C/C+source文件,点 击下一步,完成建立过程,然后在窗口中写入源代码,执行即可。.相关原理分析了解TCP/IP 原理TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。它们分别 是传输控制协议和互连网协议。这两个协议属于众多的TCP/IP协议组中的一部分。TCP/IP协议组中的协议保证Internet上数据的传输,提供了几乎现在上网所用到的所有 服务。这些服务包括:电子邮件的传输,文件传输,新闻组的发布,访问万维网

7、在TCP/IP协议组分两种协议:网络层的协议和应用层的协议网络层协议:网络层协议管理离散的计算机间的数据传输。这些协议用户注意不到,是在系统表层以下工作的。比如,IP协议为用户和远程计算机提供了信息包的传输 方法。它是在许多信息的基础上工作的,比如说是机器的IP地址。在机器IP地址和其它信 息的基础上,IP确保信息包能正确地到达目的机器。通过这一过程,IP和其它网络层的协议 共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的IP。应用层协议:相反地,应用层协议用户是可以看得到的。比如,文件传输协议(FTP)用户是看得到的。 用户为了传输一个文件请求一个和其它计算机的连接,连接建立后

8、,就开始传输文件。在传输时,用户和远程计算机的交换的一部分是能看到的。TCP/IP通过使用协议栈工作。这个栈是所有用来在两台机器间完成一个传输的所有协议 的几个集合。(这也就是一个通路,数据通过它从一台机器到另一台机器。)栈分成层,与 这里有关的是五个层。栈的每一层都能从相邻的层中接收或发送数据。每一层都与许多协议 相联系。在栈的每一层,这些协议都在起作用。本章的下一部分将分析这些服务,以及它们 在栈中是如何联系的。同时也分析一下它们的功能,它们提供的服务和与安全性的关系。Winsock 编程原理通过Winsock可实现点对点或广播通信程序,实际这两者之间的区别不大,编程时 其程序流程所用代码

9、几乎相同,不同的地方在于目标地址选择的不同。由于Winsock的服务是以动态链接库 Winsock DLL形式实现的,因此先调用1、WSAStartup 对 Winsock DLL 进行初始化2、应用程序关闭套接字后,还应调用 WSACleanup终止对Winsock DLL的使用3.23Winsock编程模型:流套接字编程模型:.服务器进程创建套接字socket.将本地地址绑定到所创建的套接字bind.将套接字置入监听模式并准备接受连接请求listen , accept.客户进程调用socket函数创建客户端套接字.客户向服务进程发出连接请求connect.当服务器接收到客户请求,阻塞的ac

10、cept进程,生成新一个新的套接字与客户套接字建立连接,并向客户端返回接受信号.客户套接字收到服务器接受信号,表示连接建立成功,开始用 send, recv进行收发数据8关闭套接字先用 shutdown 再用 closesocket数据报套接字编程模型:服务器用socket创建,用bind绑定用readfrom从网络上接收,收不到进入阻塞客户端也用socket , bind绑定客户端用sendto发送数据服务器端接收数据,用sendto进行响应数据发送完两者调用closesocket进行套接字释放Winsock I/O 模型:阻塞模式:一直等待下去,不会立即返回非阻塞模式:无论何都会返回关交出

11、程序的控制权3.3TP工作原理文件传输协议是从一个系统向另一个系统传递文件的标准方法。它的目标在RFC 0765中写得很清楚。FTP的目标1)促进文件和程序的共享2)鼓励间接和含蓄的使用远程计算机3)使用户不必面对主机间使用的不同的文件存储系统4)有效和可靠地传输文件。FTP,尽管用户可以直接通过终端来使用,是设计成让别的 程序使用的。FTP文件传输应用在客户/服务环境。请求机器启动一个FTP客户端软件。这就给目标文 件服务器发出了一个请求。典型地,这个要求被送到端口 21。一个连接建立起来后,目标 文件服务器必须运行一个 FTP服务软件。FTPD是标准的FTP服务daemon。它的功能很简

12、单:回复inetd收到的连接请求,并满足这些要传输文件的请求。这个daemon在许多发行 版的UNIX中是个标准。FTPD等待一个连接请求。当这样的一个请求到达时,FTPD请求用 户登录。用户提供它的合法的登录名和口令或匿名登录 。一旦登录成功,用户可以下载文件 了。在某些情况下,如果服务器的安全允许,用户可以上载文件。3.4Winsock API 基本函数介绍WSAStartup ()函数和 WSACleanup ()函数由于 Winsock 2提供的API服务是以动态链接库 ws2_32.dll实现的,所以必须先调用 WSAStartup()函数对ws2_32.dll进行加载初始化,协商

13、Winsock的版本支持,并分配必要 的资源。在应用程序关闭套接字后,还应调用WSACleanup()函数来终止和卸载动态链接库 ws2_32.dll ,释放资源。socket ()函数服务进程和客户进程在通信前必须创建各自的套接字,然后才能用相应的套接字进行发 送、接收操作,实现数据的传输。服务进程总是先于客户进程启动,服务进程和客户进程调 用socket()函数创建套接字obind()函数当用socket()创建套接字后,它便存在于一个名字空间(地址族)中,但并未赋名。bind ()函数通过给一个未命名套接字分配一个本地名字(主机地址/端口号)来为套接字建立本地捆绑。客户端一般隐式地向操作

14、系统请求一个随机的未使用过的临时端口号,跟自己的IP地址一起,与所创建的套接字建立联系,由于该临时端口号客户端程序事先是不确定的, 因此不显式地使用绑定函数。listen()函数调用listen()函数对服务器上套接字启动监听,即允许客户连接请求开始排队。accept()函数服务器设置监听工作方式后,通过调用accept()函数使套接字等待接受客户连接。如 果已有连接请求到来,该函数会返回一个新的套接字描述符,它对应于已经接受的那个客户 端连接。对于该客户机后续的所有操作,都应使用这个新套接字。至于原来那个监听套接字, 它仍然用于接受其他客户机连接,继续处于监听模式。connect()函数客户

15、端利用connect()函数和服务器建立一个端到端的连接。closesocket() 函数网络通信任务完成后,利用本函数释放套接字占用的所有资源。.总体设计了解Winsock与操作系统的关系I应用程序I应用程序2操件系统Windows动态链:接库网络编程接口一Witisock APITCP/IP办议栈网仪抠动程序物应施宿乔而实现功能流程图.详细设计文件传输源程序代码(1)客户端client程序代码#include Winsock.h#include windows.h#include stdio.h#include time.h#include #define RECV_PORT 3312#d

16、efine SEND_PORT 4302#pragma comment(lib, wsock32.lib)SOCKET sockclient;char filename20;/文件名sockaddr_in ServerAddr;/ 服务器地址char rbuff1024;/接收缓冲区char sbuff1024;/发送缓冲区char InputIP20;/存储输入的服务器IPvoid help() /处理help命令cout欢迎进入迷你FTP帮助菜单endl* * * * * * * * * * * * * * * * * * * *endll.get.下载(接受)文件endlget的用法:g

17、et文件名endlendl2.put.上彳(发送)文件endlput的用法:put文件名endl3.pwd. 显示当前文件夹的绝对路径endl4.dir.显示远方当前目录的文件endlendl5.cd.改变远方当前目录和路径endlcd的用法(进入下级目录):cd路径名endlcd的用法(进入上级目录):cd .endlendl6.?或者help进入帮助菜单endl7.quit退出 FTP endl*endl;/*dir:列出远方当前目录 */void list(SOCKET sockfd)int nRead;while(true)nRead=recv(sockclient,rbuff,102

18、4,0);/recv 函数通过sockclient套接口接受数据存入rbuff缓冲区,返回接受到的字节数if(nRead=SOCKET_ERROR) printf(read response error!n);exit(1);if(nRead=0)/数据读取结束break;/显示数据rbuffnRead=0;printf(%s,rbuff); int SendFile(SOCKET datatcps,FILE* file)/*put传给远方一个文件*/printf( sending file data.);for(;)/从文件中循环读取数据并发送客户端int r=fread(sbuff,1,1

19、024,file);/fread函数从 file 文件读取 1 个 1024 长度的数据到sbuff ,返回成功读取的元素个数if(send(datatcps,sbuff,r,0)=SOCKET_ERROR)printf(lost the connection to client!n);closesocket(datatcps);return 0;if(r1024)/文件传送结束break;closesocket(datatcps);printf(donen);return 1;DWORD StartSock() / 启动 winsock WSADATA WSAData;char a20;me

20、mset(a,0,20);if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/力口载 winsock 版本printf(sock init fail!n);return (-1); if(strncmp(InputIP ,a,20)=0) printf(请输入连接的主机IP:);scanf(%s”,&InputIP);/设置地址结构ServerAddr.sin_family=AF_INET;/AF_INET表示使用 IP 地址族ServerAddr.sin_addr.s_addr=inet_addr(InputIP);/指定服务器 IPServerAddr.si

21、n_port=htons(RECV_PORT);/设置端口号return(1);/创建套接字DWORD CreateSocket()sockclient=socket(AF_INET,SOCK_STREAM,0);/ 当 socket 函数成功调用时返回一个新的 SOCKET(Socket Descriptor) if(sockclient=SOCKET_ERROR) printf(sockclient create fail! n); WSACleanup(); return(-1); return(1); DWORD CallServer() / 发送连接请求 CreateSocket()

22、; if(connect(sockclient,(structsockaddr*)&ServerAddr,sizeof(ServerAddr)=SOCKET_ERROR) /connect函数创建与指定外部端口的连接 printf(Connect fail n); memset(InputIP ,0,20); return(-1);return(1);DWORD TCPSend(char data口)/发送命令int length;length=send(sockclient,data,strlen(data),0); /send 函数通过sockclient接口发送data里面的数据,发送成

23、功返回发送的字节数if(length0)fwrite(rbuff,sizeof(rbuff),count,fd);/把count个数据长度为size0f ()的数据从rbuff输入到fd指向的目标文件fclose(fd);/ 关闭文件if(strncmp(rbuff,put,3)=0)/putstrcpy(filename,rbuff+9);fd2=fopen(filename,rb);/rb读写打开一个二进制文件,只允许读写数据if(fd2)if(!SendFile(sockclient,fd2)printf(send failed!);return 0;fclose(fd2);/ 关闭文件

24、else/打开文件失败strcpy(sbuff,cant open file!n);if(send(sockclient,sbuff,1024,0)return 0;if(strncmp(rbuff,dir,3)=0)/dirprintf(n);list(sockclient);/列出接受到的列表内容if(strncmp(rbuff,pwd,3)=0)list(sockclient);if(strncmp(rbuff,cd,2)=0) closesocket(sockclient);WSACleanup();return main();/列出接受到的内容-绝对路径/cd/关闭连接/ 释放 Wi

25、nsock(2)、服务器端server程序代码#include Winsock.h#include windows.h#include stdio.h#define RECV_PORT 3312#define SEND_PORT 4302#pragma comment(lib, wsock32.lib)SOCKET sockclient,sockserver;sockaddr_in ServerAddr;/服务器地址sockaddr_in ClientAddr;/客户端地址/*全局变量*/int Addrlen;/地址长度char filename20;/ 文件名char order10;/

26、命令char rbuff1024;/接收缓冲区char sbuff1024;/发送缓冲区DWORD StartSock() / 初始化 winsockWSADATA WSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) printf(socket init fail!n);return (-1);return(1);DWORD CreateSocket()sockclient=socket(AF_INET,SOCK_STREAM,0);if(sockclient=SOCKET_ERROR)printf(sockclient create fail

27、! n);WSACleanup();return(-1);ServerAddr.sin_family=AF_INET;ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);ServerAddr.sin_port=htons(RECV_PORT);if(bind(sockclient,(structsockaddrFAR*)&ServerAddr,sizeof(ServerAddr)=SOCKET_ERROR)/bind函数将套接字和地址结构绑定printf(bind is the error);return(-1);return (1);int SendFi

28、leRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)/ 用来发送当前文件记录char filerecordMAX_PATH+32;FILETIME ft;/文件建立时间FileTimeToLocalFileTime(&pfd-ftLastWriteTime,&ft);SYSTEMTIME lastwtime;/SYSTEMTIME系统时间数据结构FileTimeToSystemTime(&ft,&lastwtime);char *dir=pfd-dwFileAttributes&FILE_ATTR旧UTE_DIRECTORY?”:;sprintf(fil

29、erecord,%04d-%02d-%02d %02d:%02d%5s %10d%-20sn,lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd-nFileSizeLow,pfd-cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)=SOCKET_ERROR)/通过datatcps 接口发送filerecord 数据,成功返回发送的字节数printf(Error occurs when sending

30、 file list!n);return 0;return 1;int SendFileList(SOCKET datatcps)HANDLE hff;/建立一个线程WIN32_FIND_DATA fd; / 搜索文件hff=FindFirstFile(*,&fd);/可以通过FindFirstFile ()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:if(hff=INVALID_HANDLE_VALUE)/ 发生错误 const char *errstr=cant list files!n;printf(list file err

31、or!n);if(send(datatcps,errstr,strlen(errstr),0)=SOCKET_ERROR) printf(error occurs when senging file list!n); closesocket(datatcps);return 0; BOOL fMoreFiles=TRUE;while(fMoreFiles)/发送此项文件信息if(!SendFileRecord(datatcps,&fd) closesocket(datatcps);return 0; /搜索下一个文件fMoreFiles=FindNextFile(hff,&fd);closes

32、ocket(datatcps);return 1; int SendFile(SOCKET datatcps,FILE* file) printf( sending file data.);for(;)/从文件中循环读取数据并发送客户端int r=fread(sbuff,1,1024,file);/ 把 file 里面的内容读到sbuff 缓冲区if(send(datatcps,sbuff,r,0)=SOCKET_ERROR)printf(lost the connection to client!n);closesocket(datatcps);return 0; if(r1024)/文件传

33、送结束break;closesocket(datatcps);printf(donen);return 1;/连接DWORD ConnectProcess()Addrlen=sizeof(sockaddr_in);if(listen(sockclient,5)0)printf(Listen error);return(-1);printf(服务器监听中n);for(;)sockserver=accept(sockclient,(struct sockaddr FAR *)&ClientAddr,&Addrlen);/accept函数取出连接队列的第一个连接请求,sockclient 是处于监听

34、的套接字ClientAddr 是监听的对象地址,/Addrlen是对象地址的长度for(;)memset(rbuff,0,1024);memset(sbuff,0,1024);if(recv(sockserver,rbuff,1024,0)0)/recv函数返回接受的字节数赋给countfwrite(rbuff,sizeof(char),count,fd);/把count个数据长度为size0f ()的数据从rbuff输入到fd指向的目标文件printf( get %s succed!n,filename);fclose(fd);/putif(strncmp(rbuff,pwd,3)=0)ch

35、ar path1000;GetCurrentDirectory(1000,path);/找到当前进程的当前目录strcpy(sbuff,path);send(sockserver,sbuff,1024,0);/pwdif(strncmp(rbuff,dir,3)=0)strcpy(sbuff,rbuff);send(sockserver,sbuff,1024,0);SendFileList(sockserver);/ 发送当前列表/dirif(strncmp(rbuff,cd,2)=0) strcpy(filename,rbuff+3);strcpy(sbuff,rbuff);send(soc

36、kserver,sbuff,1024,0);SetCurrentDirectory(filename);/设置当前目录/cdclosesocket(sockserver);/for 2/for 1int main()if(StartSock()=-1)/初始化winsockreturn(-1);if(CreateSocket()=-1)/创建套接字,绑定等一系列操作return(-1);if(ConnectProcess()=-1)/建立连接,并进行相应的命令操作return(-1);return(1);六、系统实现步骤先在编译器中运行server.exe程序,然后服务器进入监听状态;然后再运行client.exe程序,进入连接server状态,输入本机的IP地址,进入连接交互界 面。 E;酶习+ 作岖dient6 1Dcbugclicnt6 1+exe请输入连接的服务器IP; 192, 16& L LS5请输入命令(输入?或help进入帮助菜单):9欢迎

温馨提示

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

评论

0/150

提交评论