ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:77.58KB ,
资源ID:28007025      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28007025.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统课程设计说明书.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统课程设计说明书.docx

1、操作系统课程设计说明书中北大学操作系统课程设计说 明 书学 院、系:软件学院专 业:软件工程学 生 姓 名:崔 健学 号:0921010524设 计 题 目:基于Linux的小型远程FTP服务系统的设计 起 迄 日 期: 2011年12月22日- 2012年1月7日指 导 教 师:薛海丽2012 年 1月 7 日1 需求分析1.1 设计目的ftp远程服务是操作系统的重要功能之一。用高级语言编写和调试一个简单的FTP服务系统,掌握对进程、线程、进程互斥、同步、通信、文件系统及网络编程的方法。从而加深对远程服务机制的理解和认识。 1.2 设计内容和要求 客户端的要求a) 客户通过身份请求后创建一个

2、新线程来响应客户请b) 客户可以完成目录的创建,删除,切换,查看当前目录下的文件。c) 客户可以上传和下载目录到指定的文件夹。 服务端的要求a) 验证用户的登录信息。b) 支持多线程的使用。c) 记录活动客户数,客户在线数目加1,断开连接减1.2 总体设计 客户端与服务端建立连接模块:网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。其具有一个类似于打开文件的函数调用socket(),返回一个整形的Socket描述符,随后的连接建立,数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket和数据报式Socket。流式是一种面向连接的

3、Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 本系统使用前者。在使用socket进行网络传输之前,必须配置该socket。Bind函数将socket与本机上的一个端口相关联,随后就可以在该端口发起向服务端的请求和监听服务请求。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存远端信息并与远端服务器建立一个TCP连接。只有面向连接的客户程序使用socket是才需要将此socket与远端主机相连。面向连接的服务器从不启动一个连接,它只是被动的在协议端口监听客户的请求。Listen函数使s

4、ocket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。Accept()函数让服务器接受客户的连接请求,当accept()函数监视的socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的socket上监听。系统中的fork()函数生成一个子进程来处理数据传输部分,fork()函数对于子进程返回的值为0,所以包含fork函数的if语句是子进程代码部分,它与if语句后面的父进程代码部分并发执行。 客户端发送操作命

5、令和服务端接受命令执行相应的操作:send()和recv()函数用于面向连接的socket上进行数据传输。Send()函数返回实际上发送出去的字节数,可能会少于你希望发送的数据。在程序中应将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。Recv()函数返回实际上接受的字节数。接受到客户端的命令后,确定要执行的那个命令,进入相应的子模块,完成相应的操作。 总体流程 客户端流程 服务器端流程 3 详细设计 本系统的开发过程中,我做的是处理客户端发来的请求并调用系统函数执行相应的操作这一模块。服务端接受并处理cd,ls,quit,mkdi

6、r,rmdir,upload,download这样几种类型的客户端发来的命令。Cd 工作路径:修改当前工作路径;ls 工作路径:列出工作路径下的内容列表;quit:客户端退出系统;mkdir 目录名称:在当前的工作路径下建立一个由参数确定的目录;rmdir 目录名称:在当前工作路径下删除给定名称的目录;upload:将客户程序所在文件夹下的要求上传的文件上传到要求上传到的服务器端的那一文件夹下;download:将操作的当前工作路径下的指定的某一文件下载到客户程序所在的文件夹中。使用while循环不断接受客户发来的命令请求,并在客户端发来quit命令后,跳出循环,调用close()函数来释放该

7、通讯的socket,从而停止在该socket上的任何数据操作。 while(1) bzero(buffer,BUFFER_SIZE); printf(请输入指令:); getstr(cmd); char action10=; if(strcmp(cd,strncpy(action,cmd,2)=0|strcmp(ls,strncpy(action,cmd,2)=0|strcmp(quit,strncpy(action,cmd,4)=0|strcmp(rmdir,strncpy(action,cmd,5)=0|strcmp(mkdir,strncpy(action,cmd,5)=0) write

8、(client_socket,cmd,sizeof(cmd); read(client_socket,buffer,BUFFER_SIZE); printf(%sn,buffer); if(strcmp(quit,strncpy(action,cmd,4)=0) /printf(Bye!); break; else if(strcmp(download,cmd)=0) bzero(file_name, FILE_NAME_MAX_SIZE+1); printf(Please Input File Name On Server:t); getstr(file_name); strcpy(buff

9、er,download ); strcat(buffer,file_name); /strncpy(buffer, file_name, strlen(file_name)BUFFER_SIZE?BUFFER_SIZE:strlen(file_name); /向服务器发送buffer中的数据 /send(client_socket,buffer,BUFFER_SIZE,0); write(client_socket,buffer,sizeof(buffer); bzero(buffer,BUFFER_SIZE); /取得服务端发来的是否存在文件的信息 read(client_socket,bu

10、ffer,BUFFER_SIZE); if(strcmp(buffer,文件不存在)=0) printf(您请求的文件不存在!n); continue; else FILE *fp = fopen(file_name,w); if(NULL = fp ) printf(File:t%s Can Not Open To Writen, file_name); continue; /从服务器接收数据到buffer中 bzero(buffer,BUFFER_SIZE); int length = 0; length = recv(client_socket,buffer,BUFFER_SIZE,0)

11、; /循环接收,再写到文件,现在的水平只能实现文件的大小小于sizeof(buffer) / if(length 0) printf(Recieve Data From Server Failed!n); continue; / int write_length = write(fp, buffer,length); int write_length = fwrite(buffer,sizeof(char),length,fp); if (write_length0) printf(file_block_length = %dn,file_block_length); /发送buffer中的字

12、符串到new_server_socket,实际是给客户端 if(send(client_socket,buffer,file_block_length,0)BUFFER_SIZE?BUFFER_SIZE:strlen(file_name); /向服务器发送buffer中的数据 send(client_socket,buffer,BUFFER_SIZE,0); FILE * fp = fopen(file_name,w); if(NULL = fp ) printf(File:t%s Can Not Open To Writen, file_name); exit(1); bzero(buffe

13、r,BUFFER_SIZE); int length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0) if(length 0) printf(Recieve Data From Server %s Failed!n, argv); break; int write_length = write(fp, buffer,length); int write_length = fwrite(buffer,sizeof(char),length,fp); if (write_lengthlength) printf(File:t

14、%s Write Failedn, file_name); break; bzero(buffer,BUFFER_SIZE); printf(Recieve File:t %s From Server%s Finishedn,file_name, argv); close(fp); length = recv(client_socket,buffer,BUFFER_SIZE,0); /循环接收,再写到文件 if(length 0) printf(Recieve Data From Server Failed!n); continue; / int write_length = write(fp

15、, buffer,length); printf(%dn,length); int write_length = fwrite(buffer,sizeof(char),length,fp); close(fp); printf(%dn,write_length); printf(%sn,buffer); if (write_lengthlength) printf(File:t%s Write Failedn, file_name); continue; /bzero(buffer,BUFFER_SIZE); 4心得体会通过这次课程设计,我们不仅对C语言的知识重新巩固,而且通过查阅相关资料,对Linux的操作系统有了新的认识。1. Linux不同于Windows,主要体现在操作界面,及一些软件的兼容性。如在Windows下是可执行文件,而在Linux成为普通的文件,甚至不能进行操作。2. 对Linux下的指令操作有了新的认识与理解,Linux操作系统有好多不同的版本,但是所有的操作指令几乎都一样,更便于学习使用。 3. 真正的多线程并发执行,多个用户可以同步进行操作,并且互不影响,这也是本次设计的任务之一。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1