linux下基于Socket的文件传输程序课程设计.docx
- 文档编号:24030073
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:16
- 大小:314.32KB
linux下基于Socket的文件传输程序课程设计.docx
《linux下基于Socket的文件传输程序课程设计.docx》由会员分享,可在线阅读,更多相关《linux下基于Socket的文件传输程序课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
linux下基于Socket的文件传输程序课程设计
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;
上传客户端下指定路径下的指定文件:
senddatafilename;
退出连接:
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);//打印文件名,文件类型
strcat(buf,ptr->d_name);strcat(buf,"");//文件名,文件类型存入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("succeedsend!
");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);
mid(getname,buf,flag-9,9);strcpy(getname2,test_path);strcat(getname2,getname);
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);
}
void*get_command()
{intop;
puts("查看文件1;重命名文件2;删除文件3;开始进入服务模式4");
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);//打印文件名,文件类型
closedir(dir);
puts("查看文件1;重命名文件2;删除文件3;开始进入服务模式4\n");
}
elseif(op==2){//重命名
puts("输入要重命名的文件,以及更改后到名字:
");
charname_from[20];charname_to[20];charname_from_path[50];charname_to_path[50];
scanf("%s",name_from);
scanf("%s",name_to);
strcpy(name_from_path,test_path);strcat(name_from_path,name_from);
strcpy(name_to_path,test_path);strcat(name_to_path,name_to);
rename(name_from_path,name_to_path);
puts("更改成功!
");
puts("查看文件1;重命名文件2;删除文件3;开始进入服务模式4\n");
}
elseif(op==3){//删除
puts("输入要删除文件名:
");
charname_delete[20];charname_delete_path[50];
scanf("%s",name_delete);
strcpy(name_delete_path,test_path);strcat(name_delete_path,name_delete);
remove(name_delete_path);
puts("删除成功!
");
puts("查看文件1;重命名文件2;删除文件3;开始进入服务模式4\n");
}
elseif(op==4){break;}
else{puts("无效操作!
");
puts("查看文件1;重命名文件2;删除文件3;开始进入服务模式4\n");}
}
return(NULL);
}
主要客户端代码:
intmain(){
intread_size_limit;
if((read_size_limit=recv(fd,buf_limit,BUFFER_SIZE,0))==-1){
perror("recverror.");
exit
(1);
}
if(!
strcmp(buf_limit,"end"))
exit(0);
elseif(!
strcmp(buf_limit,"1")){read_size_limit=1;puts("权限为能查看服务器下的文件名(look_up)");}
elseif(!
strcmp(buf_limit,"2")){read_size_limit=2;puts("权限为能查看服务器下的文件名(look_up)与下载文件(download)");}
else{read_size_limit=3;puts("权限为能查看服务器下的文件名(look_up),上传文件(senddata),下载文件(download)");}
//free(buf_limit);
//权限管理
pthread_create(&tid,NULL,&get_server,(void*)fd);//创建新线程
while
(1){
//puts("send:
");
memset(buf,0,sizeof(buf));
if((send_size=read(fileno(stdin),buf,BUFFER_SIZE))==-1){
perror("readerror.");
break;
}
buf[send_size-1]=0;
if(read_size_limit==3)
{
if(!
strncmp("download",buf,8))
{send_size=send(fd,buf,strlen(buf)+1,0);mid(getname,buf,send_size,8);}
elseif(!
strncmp("senddata",buf,8))
{mid(getname2,buf,send_size-9,9);
charpath_1[50];strcpy(path_1,test_path);strcat(path_1,getname2);
intfrom_fd;
from_fd=open(path_1,O_RDONLY);
if(from_fd<0)
{
puts("打开源文件失败,退出!
\n");
exit(-1);
}
intret=1;
charbuf_send[BUFFER_SIZE];
memset(buf_send,0,sizeof(buf_send));
strcat(buf,"@");
while(ret){
ret=read(from_fd,buf_send,BUFFER_SIZE);
}
strcat(buf,buf_send);
send(fd,buf,strlen(buf)+1,0);
memset(path_1,0,sizeof(path_1));
close(from_fd);
}
else{send_size=send(fd,buf,strlen(buf)+1,0);}
}
elseif(read_size_limit==2)
{if(!
strncmp("senddata",buf,8))
puts("无上传权限!
");
else{
send_size=send(fd,buf,strlen(buf)+1,0);
if(!
strncmp("download",buf,8))
mid(getname,buf,send_size,8);
}
}
elseif(read_size_limit==1)
{if(!
strncmp("download",buf,8))
puts("无下载权限!
");
elseif(!
strncmp("senddata",buf,8))
puts("无上传权限!
");
else
send_size=send(fd,buf,strlen(buf)+1,0);
}
if(!
strcmp(buf,"end"))
break;
}
close(fd);
exit(0);
}
void*get_server(void*sockfd)
{//charbuf1[BUFFER_SIZE];
charbuf1[BUFFER_SIZE];
memset(buf1,0,sizeof(buf1));
intread_size;
while
(1){
memset(buf1,0,sizeof(buf1));
if((read_size=recv((int)sockfd,buf1,BUFFER_SIZE,0))==-1){
perror("recverror.");
exit
(1);
}
if(!
strcmp(buf1,"end")){
break;
}
elseif(!
strncmp("begin",buf1,5)){
charpath_2[50];strcpy(path_2,test_path);strcat(path_2,getname);
to_fd=open(path_2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
intx=1;
charbuf_receive[BUFFER_SIZE];
memset(buf_receive,0,sizeof(buf_receive));
mid(buf_receive,buf1,strlen(buf1)-5,5);
x=write(to_fd,buf_receive,strlen(buf1)-5);
puts("文件下载成功!
\n");
//free(buf_receive);
memset(path_2,0,sizeof(path_2));
close(to_fd);
}
else{printf("\n\007%s\n",buf1);}
}
close((int)sockfd);
//free(buf1);
return(NULL);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 基于 Socket 文件传输 程序 课程设计