linux下基于Socket的文件传输程序课程设计.docx
《linux下基于Socket的文件传输程序课程设计.docx》由会员分享,可在线阅读,更多相关《linux下基于Socket的文件传输程序课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
![linux下基于Socket的文件传输程序课程设计.docx](https://file1.bdocx.com/fileroot1/2022-10/2/b13ebeb8-c77d-456f-a841-1dc71746808b/b13ebeb8-c77d-456f-a841-1dc71746808b1.gif)
课程设计题目 Linux下基于Socket的文件传输程序设计
学院 计算机学院 专业 计算机科学与技术 年级 2009级已知参数和设计要求:
要求:
1、系统分为客户端和服务器端,客服端可以实现文件的上传、下载以及查看服务器下默认目录的文件列表;服务器端可以对文件进行管理,包括上传,下载,删除文件,重命名等;
2、在内核中添加一个自己的内存分配和释放的系统调用(可以调用malloc()和free
()等内存管理函数实现),并在程序中调用;
3、支持多个客户端同时对服务器中的文件进行操作(多线程);
加分项:
1、实现了用户的权限管理;
2、内存分配和释放用内存池实现;
3、程序功能比较完善,如可以变更文件目录等;
学生应完成的工作:
设计并实现。
目前资料收集情况(含指定参考资料):
Linux内核设计与实现(第三版)
课程设计的工作计划:
任务下达日期2012年7月2日 完成日期2012年7月5日
1需求分析
1.1系统目的
Linux作为一个先进的操作系统,其发展越来越快,应用领域也越来越广泛。
在学习了《linux内核设计与实现》之后,亲自设计并实现linux下的编程,不仅有助于巩固学过的知识,更能扩宽自己的视野,增强动手实践能力。
1.2课程要求
Linux下基于Socket的文件传输程序设计,包括对文件进行管理,包括上传,下载,删除文件,重命名,支持多线程等。
1.3开发工具与开发平台
开发工具:
C语言开发平台:
Linux
2系统设计
2.1系统功能
此软件的主要功能有:
1.实现在linux环境下的基于socket文件传输;
2.对linux环境下的文件进行简单管理。
其中客户端与服务器的所要完成的具体功能如下:
客户端:
(1)连接服务器,并发送指令给服务器;
(2)接收并识别服务器发来的信息;
(3)通过不同指令实现文件的查看,下载,和上传。
服务器:
(1)能查看本地的文件,并进行简单的管理,如删除,重命名等
(2)接收来自客户端的连接请求,并赋予客户端不同的操作权限;
(3)识别客户端的发来的指令,实现与客户端间的文件下载和上传。
2.2系统结构
软件由服务器端和客户端两部分组成,服务器端监听客户对某个特定端口的网络连接请求,并与之建立连接,这样,这个客户的数据就可以发送到服务器。
客户端的任务是将用户的指令发送给服务器,且客户端可以有多个。
客户端运行时将立即向服务器的某个端口发送连接请求,待连接建立后则由用户的发送线程发送该用户的指令到服务器。
服务器端的主线程负责监听某个端口,接收用户的发送线程发出的指令。
在客户端,用户接收线程接收服务器发送的数据,由用户端主线程进行处理后显示。
2.3客户端指令
查看服务器下指定路径下的所有文件:
look_up;
下载服务器下指定路径下的指定文件:
downloadfilename;上传客户端下指定路径下的指定文件:
senddata filename;退出连接:
end;
2.4服务器指令
运行服务器后,系统提示指令
查看所有文件请输入1;重命名文件请输入2;删除文件请输入3;开启服务监听模式4;
2.5数据流设计
3测试结果
服务器进行文件管理的操作
服务器监听多个客户端并相应其指令
客户端0连接服务器
客户端1连接服务器
4总结
这次课程设计是linux下的socket通信,以c为编程语言,并实现了文件管理与多线程开发。
通过此次课程设计,进一步熟悉了linux操作系统的使用,掌握了linux下
socket通信的基本配置,加深了对所学知识的理解,更扩宽了自己的视野,增强动了手实践能力。
5参考资料
《Linux内核设计与实现》第三版 RobertLove著
6附录代码
主要服务器代码:
void*get_client(void*sockfd)
{
charbuf[BUFFER_SIZE];memset(buf,0,sizeof(buf));
intread_size;
//time_ttimep;
intlimit;
printf("有客户端接入!
请输入要授予client%d的权限\n",maxi);printf("1为仅能查看服务器下的文件名\n");
printf("2为能查看服务器下的文件名与下载文件\n");
printf("3为能查看服务器下的文件名,上传文件,下载文件\n");scanf("%d",&limit);
if(limit==1) {strcpy(buf,"1");}elseif(limit==2){strcpy(buf,"2");}elseif(limit==3){strcpy(buf,"3");}
else{printf("输入错误,结束程序!
");exit(0);}
send((int)sockfd,buf,strlen(buf)+1,0);//客户端权限控制
do{
memset(buf,0,sizeof(buf));//数组清零if((read_size=recv((int)sockfd,buf,BUFFER_SIZE,0))==-1){
perror("recverror.");exit
(1);
}//接收数据
if(!
strcmp(buf,"end"))
{
puts("客户端退出");break; }
elseif(!
strcmp(buf,"look_up")){memset(buf,0,sizeof(buf));dir=opendir(test_path);
while((ptr=readdir(dir))!
=NULL)
if(strcmp(ptr->d_name,".")&&strcmp(ptr->d_name,"..")){
//printf("d_name:
%s%c\n",ptr->d_name,ptr->d_type);//打
印文件名,文件类型
存入buf发送
strcat(buf,ptr->d_name);strcat(buf,"");//文件名,文件类型
}
closedir(dir);send((int)sockfd,buf,strlen(buf)+1,0);
}//相应客户端查看文件操作
else{
if(!
strncmp("download",buf,8))
{
chartest[50];chartest2[50];
mid(test,buf,strlen(buf)-9,9);strcpy(test2,test_path);strcat(test2,test);from_fd=open(test2,O_RDONLY);//打开要发送的文件if(from_fd<0)
{
puts("打开源文件失败,退出!
\n");exit(-1);
}
memset(buf,0,sizeof(buf));intret=1;
charbuf_send[BUFFER_SIZE];memset(buf_send,0,sizeof(buf_send));
到文件
strcpy(buf,"begin");while(ret){
ret=read(from_fd,buf_send,BUFFER_SIZE);//读入要发送
}
strcat(buf,buf_send);send((int)sockfd,buf,strlen(buf)+1,0);//发送
/* //while(ret){
ret=read(from_fd,buf_send,BUFFER_SIZE);send((int)sockfd,buf_send,strlen(buf_send)+1,0);
// }*/puts("succeed
send!
");memset(test,0,sizeof(test));memset(test2,0,sizeof(test2));
close(from_fd);
//free(buf_send);
}
elseif(!
strncmp("senddata",buf,8)){
chargetname[20];chargetname2[50];intto_fd;
char*ptr;
ptr=strchr(buf,'@');intflag=(int)(ptr-buf);
e);
mid(getname,buf,flag-9,9);strcpy(getname2,test_path);strcat(getname2,getnam
to_fd = open(getname2, O_WRONLY|O_CREAT,
S_IRUSR|S_IWUSR);//创建要接收的文件
intx=1;
charbuf_receive[BUFFER_SIZE];memset(buf_receive,0,sizeof(buf_receive));
数据写入文件
mid(buf_receive,buf,strlen(buf)-flag-1,flag+1);x=write(to_fd,buf_receive,strlen(buf)-flag-1);//把收到到
puts("文件上传成功!
\n");
memset(getname,0,sizeof(getname));memset(getname2,0,sizeof(getname2));close(to_fd);
}
else{puts("无效指令\n");}
}
}while(read_size!
=0);
close((int)sockfd);
//free(buf);return(NULL);
}
4");
void*get_command()
{ intop;
puts("查看文件1;重命名文件2;删除文件3;开始进入服务模式
while
(1){scanf("%d",&op);if(op==1){//查看
dir=opendir(test_path);while((ptr=readdir(dir))!
=NULL)
if(strcmp(ptr->d_name,".")&&strcmp(ptr->d_name,".."))printf("d_name:
%s%c\n",ptr->d_name,ptr->d_type);//打印文
件名,文件类型
模式4\n");
closedir(dir);
puts("查看文件1;重命名文件2;删除文件3;开始进入服务
}
elseif(op==2){//重命名
puts("输入要重命名的文件,以及更改后到名字:
");
char name_from[20];char name_to[20];charname_from_path[50];charname_to_path[50];
scanf("%s",name_from);scanf("%s",n