Linux课程设计.docx
- 文档编号:24242794
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:30
- 大小:432.73KB
Linux课程设计.docx
《Linux课程设计.docx》由会员分享,可在线阅读,更多相关《Linux课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
Linux课程设计
重庆大学课程设计报告
课程设计题目:
Linux下基于socket的文件传输程序设计
学院:
计算机学院
专业班级:
网络工程一班
年级:
姓名:
学号:
完成时间:
2012年06月22日
成绩:
指导教师:
重庆大学教务处制
课程设计指导教师评定成绩表
项目
分值
优秀
(100>x≥90)
良好
(90>x≥80)
中等
(80>x≥70)
及格
(70>x≥60)
不及格(x<60)
评分
参考标准
参考标准
参考标准
参考标准
参考标准
学习态度
15
学习态度认真,科学作风严谨,严格保证设计时间并按任务书中规定的进度开展各项工作
学习态度比较认真,科学作风良好,能按期圆满完成任务书规定的任务
学习态度尚好,遵守组织纪律,基本保证设计时间,按期完成各项工作
学习态度尚可,能遵守组织纪律,能按期完成任务
学习马虎,纪律涣散,工作作风不严谨,不能保证设计时间和进度
技术水平与实际能力
25
设计合理、理论分析与计算正确,实验数据准确,有很强的实际动手能力、经济分析能力和计算机应用能力,文献查阅能力强、引用合理、调查调研非常合理、可信
设计合理、理论分析与计算正确,实验数据比较准确,有较强的实际动手能力、经济分析能力和计算机应用能力,文献引用、调查调研比较合理、可信
设计合理,理论分析与计算基本正确,实验数据比较准确,有一定的实际动手能力,主要文献引用、调查调研比较可信
设计基本合理,理论分析与计算无大错,实验数据无大错
设计不合理,理论分析与计算有原则错误,实验数据不可靠,实际动手能力差,文献引用、调查调研有较大的问题
创新
10
有重大改进或独特见解,有一定实用价值
有较大改进或新颖的见解,实用性尚可
有一定改进或新的见解
有一定见解
观念陈旧
论文(计算书、图纸)撰写质量
50
结构严谨,逻辑性强,层次清晰,语言准确,文字流畅,完全符合规范化要求,书写工整或用计算机打印成文;图纸非常工整、清晰
结构合理,符合逻辑,文章层次分明,语言准确,文字流畅,符合规范化要求,书写工整或用计算机打印成文;图纸工整、清晰
结构合理,层次较为分明,文理通顺,基本达到规范化要求,书写比较工整;图纸比较工整、清晰
结构基本合理,逻辑基本清楚,文字尚通顺,勉强达到规范化要求;图纸比较工整
内容空泛,结构混乱,文字表达不清,错别字较多,达不到规范化要求;图纸不工整或不清晰
指导教师评定成绩:
指导教师签名:
年月日
重庆大学本科学生课程设计任务书
课程设计题目
Linux下基于socket的文件传输程序设计
学院
计算机学院
专业
网络工程
年级
2009级
已知参数和设计要求:
系统分为客户端和服务器端,客服端可以实现文件的上传、下载以及查看服务器下默认目录的文件列表;服务器端可以对文件进行管理,包括上传,下载,
删除文件,重命名等;
学生应完成的工作:
1、编程实现上述功能。
2、在内核中添加一个自己的内存分配和释放的系统调用(可以调用
malloc()和free()等内存管理函数实现),并在程序中调用;
3、支持多个客户端同时对服务器中的文件进行操作(多线程);
加分项:
1、实现了用户的权限管理
2、内存分配和释放用内存池实现;
3、程序功能比较完善,如可以变更文件目录等;
目前资料收集情况(含指定参考资料):
[1]美RobertLove著_陈莉君康华译_Linux内核设计与实现_机械工业出版社_2011.6
[2]美DanielP.Bovet著_陈莉群冯锐牛欣源译_深入理解LINUX内核_中国电力出版社_2008
课程设计的工作计划:
第一天:
讨论系统实现过程,并完成服务器与客户端通讯问题,主要解决了服务器端功能。
第二天:
完成了客户端功能和实现了多线程。
第三天:
完成了用户权限管理以及变更文件目录等。
第四天:
检查成果。
第五天:
完成课程设计报告。
任务下达日期2012年06月18日
完成日期2012年06月22日
计算机Linux课程设计报告书
——文件传输系统
目录
Ⅰ引言…………………………………………………………………………………2
Ⅱ总体设计……………………………………………………………………………2
2.1总体设计概念……………………………………………………………………2
2.2系统架构…………………………………………………………………………2
2.3模块划分…………………………………………………………………………2
Ⅲ详细设计……………………………………………………………………………3
3.1软件层次模型……………………………………………………………………3
3.2流程图……………………………………………………………………………4
Ⅳ编程及运行结果……………………………………………………………………5
4.1服务器端设计与编码……………………………………………………………5
4.2客户端设计与编码………………………………………………………………12
Ⅴ课程设计总结与体会…………………………………………………………………23
Ⅵ参考文献……………………………………………………………………………24
Ⅰ引言
随着我们的生活与计算机越来越紧密的结合起来,计算机可以取代生活中很多的事情。
最简单的,计算机的文件传输就可以避免远距离纸质文件传输带来的不便。
在计算机网络中,文件传输只是一个很小很细微的功能。
但它到底是怎样实现的呢?
下面就让我们自己完成一个简单的实现文件传输功能的传输器吧。
Ⅱ总体设计
2.1总体设计概念
为了实现文件传输等功能,服务器与客户端采用TCP/IP连接方式。
程序启动时,服务器开始监听,客户端连接服务器。
在客户端和服务器都各自实现相应功能。
当实现相应功能时,应注意权限设置。
2.2系统框架
选择传输控制协议TCP,分别建立客户端与服务器端;并设置相应的框架。
2.3模块划分
1)服务器端,主要实现向各个客户端发送消息,接受来自客户端的各种信息并综合处理,具体功能如下:
①连接控制:
包括启动服务器、断开服务器以及断开某个客户端的连接;
②管理作用:
包括对参与聊天者的昵称进行修改以及向所有或某个客户端发送消息,可以创建,删除,重命名文件等。
③登陆信息:
检查用户是否已登陆,如登录,显示登录用户。
④消息处理:
解析客户端与服务器端的消息交互类型,并做出相应处理,能够找到消息所对应的接收端。
⑤监听作用:
实现对服务器发送过来的消息进行监听的功能;
2)客户端:
主要实现向服务器端发布消息,并且对来自服务器的消息做出相应的响应。
具体功能如下:
①连接功能:
输入服务器地址,实现登录及断开功能
②登录设置:
登录时,发送消息使服务器端获得相关登录信息。
③消息处理:
接收由服务器端发送来的信息,并做出相应的响应;
④消息处理:
相应从服务器端接收到的消息交互类型,实现用户与用户之间的信息交互和文件交互;
⑤文件上传,下载:
实现文件上传,下载以及查看服务器下默认的文件列表等。
Ⅲ详细设计
3.1软件层次模型
服务器层次结构:
客户端层次结构:
3.2流程图
根据以上的程序模块划分,设计好服务器端和客户端的流程图,如下:
服务器端流程:
客户端流程:
Ⅳ编程以及运行结果
4.1服务器
1.进入服务器,等待连接。
intmain(intargc,char**argv)
{
printf("\n欢迎来到张驹强,李欢和谭建的FTP服务器\n");
//gettheserversocket
server_sock=socket(PF_INET,SOCK_STREAM,0);
if(server_sock==-1)//createsocketfailed
{
printf("请求socket创建失败\n");
exit(-1);
}
elseprintf("请求socket创建成功!
\n");
//configureserveraddress,port
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SERVER_PORT);
//server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(server_addr.sin_addr.s_addr==INADDR_NONE)
{
printf("IP地址错误!
\n");
exit(-1);
}
server_adr_len=sizeofserver_addr;
//bind
z=bind(server_sock,(structsockaddr*)&server_addr,server_adr_len);
if(z==-1)
{
printf("绑定失败!
\n");
exit(-1);
}
elseprintf("绑定成功!
\n");
//listen
z=listen(server_sock,5);
if(z<0)
{
printf("服务器无法监听!
");
exit
(1);
}
elseprintf("服务器开始监听\n");
//loopandwaitforconnection
while
(1)
{
//structsockaddr_inclient_addr;
client_addr_len=sizeof(client_addr);
i=0;
printf("等待连接请求...\n");
//acceptanrequest
while
(1){
pthread_tthread;
client_sock=accept(server_sock,(structsockaddr*)&client_addr,&client_addr_len);
if(client_sock<0){
printf("请求出错!
\n");
continue;
}
//实现服务器多线程操作
if((pthread_create(&thread,NULL,handleFunc,&client_sock))!
=0){
printf("创建线程失败!
\n");
break;
}
}
}
close(server_sock);
return0;
}
2.建立连接。
voidcommand_port(char*params,char*reply)
{
unsignedlonga0,a1,a2,a3,p0,p1,addr;
sscanf(params,"%lu,%lu,%lu,%lu,%lu,%lu",&a0,&a1,&a2,&a3,&p0,&p1);
addr=htonl((a0<<24)+(a1<<16)+(a2<<8)+a3);
if(addr!
=client_addr.sin_addr.s_addr)
{
stpcpy(reply,"数据传输socket请求IP地址错误!
\n");
return;
}
//setuptheportforthedataconnection
memset(&data_addr,0,sizeof(data_addr));
data_addr.sin_family=AF_INET;
data_addr.sin_addr.s_addr=addr;
data_addr.sin_port=htons((p0<<8)+p1);
//getthedatacocket
data_sock=socket(PF_INET,SOCK_STREAM,0);
if(data_sock==-1)
{
printf("数据传输socket创建失败!
");
exit(-1);
stpcpy(reply,"无法创建数据传输socket\r\n");
return;
}
//connecttotheclientdatasocket
if(connect(data_sock,(structsockaddr*)&data_addr,sizeof(data_addr))<0)
{
printf("数据传输socket连接失败!
\r\n");
exit(-1);
stpcpy(reply,"数据传输socket连接失败!
\r\n");
return;
}
stpcpy(reply,"双方连接建立成功!
\r\n");
}
3.显示登录信息。
if(strcmp(command,"USE")==0)//USER
{
stpcpy(reply,"suc\r\n");
write(clifd,reply,strlen(reply));
printf("%s进入服务器\n",buffer+4);
continue;
}
4.创建文件。
if(stat(filename,&sbuf)==-1)
{
//printf("创建文件失败.\n");
}
outfile=fopen(filename,"w");
if(outfile==0)
{
printf("创建文件失败\r\n");
exit(-1);
stpcpy(reply,"创建文件失败\r\n");
close(data_sock);
return;
}
5.删除文件。
voidcommand_delete(charfilename[],char*reply){
inti=remove(filename);
if(i<0)
stpcpy(reply,"删除失败,可能由于目标文件不存在\r\n");
else
stpcpy(reply,"删除成功\r\n");
}
6.重命名文件。
voidcommand_rename(charfilename[],charnewname[],char*reply){
//printf("%s\n",filename);
//printf("%s\n",newname);
inti=rename(filename,newname);
if(i<0)
stpcpy(reply,"重命名失败,可能由于目标文件不存在\r\n");
else
stpcpy(reply,"重命名成功\r\n");
}
7.显示当前目录。
voidcommand_list(char*reply)
{
intn=0;
charinfo[MAX_INPUT_SIZE];
charbuf[MAX_INPUT_SIZE];
stpcpy(buf,"");
DIR*mydir;
structdirent*myitem;
mydir=opendir(".");
while((myitem=readdir(mydir))!
=NULL)
{
if((strcmp(myitem->d_name,".")==0)||(strcmp(myitem->d_name,"..")==0))
continue;
stpcpy(info,myitem->d_name);
strcat(info,"\t");
strcat(buf,info);
n++;
if(n==4){
strcat(buf,"\n");
n=0;
}
}
closedir(mydir);
stpcpy(reply,buf);
return;
}
上图为服务器端运行结果。
4.2客户端
1.建立连接。
server_ip=LOCAL_IP;
server_port=SERVER_PORT;
//connecttotheftpserver
server_host=gethostbyname(server_ip);
if(server_host==(structhostent*)NULL)
{
printf(">gethostbynamefailed\n");
exit
(1);
}
//setuptheportfortheconnection
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
memcpy(&server_addr.sin_addr,server_host->h_addr,server_host->h_length);
server_addr.sin_port=htons(server_port);
//getthesocket
server_sock=socket(PF_INET,SOCK_STREAM,0);
if(server_sock<0)
{
printf(">erroronsocket()\n");
exit
(1);
}
//connecttotheserver
if(connect(server_sock,(structsockaddr*)&server_addr,sizeof(server_addr))<0)
{
printf(">erroronconnect()\n");
close(server_sock);
exit
(1);
}
//connecttotheftpserversuccessful
printf(">连接到%s:
%d\n",server_ip,server_port);
user_login();
help_info();
2.连接到服务器。
voiduser_login()
{
printf(">用户名称:
");
fgets(line_in,MAX_INPUT_SIZE,stdin);
line_in[strlen(line_in)-1]='\0';
stpcpy(name,line_in);
send_msg("USER",line_in,1);
z=read(server_sock,buffer,sizeof(buffer));
//printf("%s\n",buffer);
buffer[z-2]=0;
if(strncmp("suc",buffer,3)==0)
{
printf("欢迎来到FTP:
%s\n",name);
printf("请选择操作\n");
}
else{
printf("被服务器拒绝\n");
}
return;
}
3.帮助界面。
voidhelp_info()
{
printf("?
orhelp\t获得帮助信息\n");
printf("ls\t获得当前目录下的文件\n");
printf("pwd\t获得当前路径\n");
printf("cd\t修改路径(需要高级权限)\n");
printf("get<文件名>\t下载数据\n");
printf("put<文件名>\t上传数据\n");
printf("apply<密码>\t申请高级权限\n");
printf("rename<文件名>\t修改服务器中的中文名(需要高级权限)\n");
printf("rm\t删除服务器中的文件(需要高级权限)\n");
printf("quit\t退出FTP\n");
}
4.获得服务器当前路径。
voidcommand_pwd()
{
send_msg("PWD",name,0);
z=read(server_sock,buffer,sizeof(buffer));
buffer[z-2]=0;
printf("%s\n",buffer);
}
5.修改路径。
voidcommand_cd()
{
send_msg("CWD",&line_in[3],1);
z=read(server_sock,buffer,sizeof(buffer));
buffer[z-2]=0;
printf("%s\n",buffer);
}
6.传输文件。
intcommand_port()
{
if(client_sock<0)
{
structsockaddr_inlocal_addr;
socklen_tlocal_addr_len=sizeoflocal_addr;
memset(&local_addr,0,sizeoflocal_addr);
if(getsockname(server_sock,(structsockaddr*)&local_addr,&local_addr_len)!
=0)
{
printf("获得本地ip地址失败\n");
return-1;
}
local_ip=inet_ntoa(local_addr.sin_addr);
local_port=local_addr.sin_port;
//printf("localaddr%s:
%d\n",local_ip,local_port);
charclient_port[8]="";
sprintf(client_port,"%d.%d",(int)(local_port/256),(int)(1+local_port-256*(int)(local_port/256)));
sprintf(port_addr,"%s.%s",local_ip,client_port);
replace(port_addr,".",","
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 课程设计