重庆大学课程设计报告
课程设计题目:
linux下基于Socket的文件传输程序设计
学 院: 计算机学院
专业班级: 计算机科学与技术
年 级: 20##级
姓 名: 张浩 周键
学 号: 20095396 20095397
完成时间: 2012 年 7 月 3 日
成 绩:
指导教师: 李双庆
重庆大学教务处制
课程设计指导教师评定成绩表 : 张浩 20095396
指导教师评定成绩:
指导教师签名: 年 月 日
课程设计指导教师评定成绩表 : 周键 20095397
指导教师评定成绩:
指导教师签名: 年 月 日
重庆大学本科学生课程设计任务书
Linux 作为一个先进的操作系统,其发展越来越快,应用领域也越来越广泛。在学习了《linux内核设计与实现》之后,亲自设计并实现linux下的编程,不仅有助于巩固学过的知识,更能扩宽自己的视野,增强动手实践能力。
Linux下基于Socket的文件传输程序设计,包括对文件进行管理,包括上传,下载,删除文件,重命名,支持多线程等。
开发工具:C语言
开发平台:Linux
此软件的主要功能有:
1. 实现在linux环境下的基于socket文件传输;
2. 对linux环境下的文件进行简单管理。
其中客户端与服务器的所要完成的具体功能如下:
客户端:
(1) 连接服务器,并发送指令给服务器;
(2) 接收并识别服务器发来的信息;
(3) 通过不同指令实现文件的查看,下载,和上传。
服务器:
(1) 能查看本地的文件,并进行简单的管理,如删除,重命名等
(2) 接收来自客户端的连接请求,并赋予客户端不同的操作权限;
(3) 识别客户端的发来的指令,实现与客户端间的文件下载和上传。
软件由服务器端和客户端两部分组成,服务器端监听客户对某个特定端口的网络连接请求,并与之建立连接,这样,这个客户的数据就可以发送到服务器。客户端的任务是将用户的指令发送给服务器,且客户端可以有多个。
客户端运行时将立即向服务器的某个端口发送连接请求,待连接建立后则由用户的发送线程发送该用户的指令到服务器。服务器端的主线程负责监听某个端口,接收用户的发送线程发出的指令。在客户端,用户接收线程接收服务器发送的数据,由用户端主线程进行处理后显示。
查看服务器下指定路径下的所有文件: look_up;
下载服务器下指定路径下的指定文件:download filename;
上传客户端下指定路径下的指定文件:senddata filename;
退出连接: end ;
运行服务器后,系统提示指令
查看所有文件请输入 1 ; 重命名文件请输入 2 ; 删除文件请输入 3; 开启服务监听模式 4;
服务器进行文件管理的操作
服务器监听多个客户端并相应其指令
客户端0连接服务器
客户端1连接服务器
这次课程设计是linux下的socket通信,以c为编程语言,并实现了文件管理与多线程开发。
通过此次课程设计,进一步熟悉了linux操作系统的使用,掌握了linux下socket通信的基本配置,加深了对所学知识的理解,更扩宽了自己的视野,增强动了手实践能力。
《Linux 内核设计与实现》第三版 Robert Love 著
主要服务器代码:
void *get_client(void *sockfd)
{
char buf[BUFFER_SIZE];
memset(buf,0,sizeof(buf));
int read_size;
//time_t timep;
int limit;
printf("有客户端接入! 请输入要授予client %d 的权限\n",maxi);
printf("1为 仅能查看服务器下的文件名\n");
printf("2为 能查看服务器下的文件名与下载文件\n");
printf("3为 能查看服务器下的文件名,上传文件,下载文件\n");
scanf("%d",&limit);
if(limit==1) {strcpy(buf,"1");}
else if(limit==2){strcpy(buf,"2");}
else if(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("recv error.");
exit(1);
}//接收数据
if(!strcmp(buf, "end"))
{
puts("客户端退出");
break; }
else if(!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))
{
char test[50];char test2[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));
int ret=1;
char buf_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);
}
else if(!strncmp("senddata",buf,8)){
char getname[20];char getname2[50];
int to_fd;
char *ptr;
ptr=strchr(buf,'@');
int flag=(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);//创建要接收的文件
int x=1;
char buf_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()
{ int op;
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");
}
else if(op==2){//重命名
puts("输入要重命名的文件,以及更改后到名字:");
char name_from[20];char name_to[20];char name_from_path[50];char name_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");
}
else if(op==3){//删除
puts("输入要删除文件名:");
char name_delete[20];char name_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");
}
else if(op==4){break;}
else {puts("无效操作!");
puts("查看文件 1 ; 重命名文件 2 ;删除文件 3 ;开始进入服务模式 4\n");}
}
return(NULL);
}
主要客户端代码:
int main(){
int read_size_limit;
if((read_size_limit=recv(fd,buf_limit,BUFFER_SIZE, 0))==-1) {
perror("recv error.");
exit(1);
}
if(!strcmp(buf_limit, "end"))
exit(0);
else if(!strcmp(buf_limit, "1")){read_size_limit=1;puts("权限为能查看服务器下的文件名(look_up)");}
else if(!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("read error.");
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);}
else if(!strncmp("senddata",buf,8))
{ mid(getname2,buf,send_size-9,9);
char path_1[50];strcpy(path_1,test_path);strcat(path_1,getname2);
int from_fd;
from_fd = open(path_1, O_RDONLY);
if(from_fd<0)
{
puts("打开源文件失败,退出!\n");
exit(-1);
}
int ret=1;
char buf_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);}
}
else if(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);
}
}
else if(read_size_limit==1)
{ if(!strncmp("download",buf,8))
puts("无下载权限!");
else if(!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)
{ //char buf1[BUFFER_SIZE];
char buf1[BUFFER_SIZE];
memset(buf1,0,sizeof(buf1));
int read_size;
while(1){
memset(buf1,0,sizeof(buf1));
if((read_size=recv((int)sockfd,buf1,BUFFER_SIZE, 0))==-1) {
perror("recv error.");
exit(1);
}
if(!strcmp(buf1, "end")){
break;
}
else if(!strncmp("begin",buf1, 5)){
char path_2[50];strcpy(path_2,test_path);strcat(path_2,getname);
to_fd = open(path_2, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
int x=1;
char buf_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);
}
Linux课程设计姓名:**学号:**学院:信息科学与工程学院班级:网络一班题目:Linux环境下服务器配置与实现20**年12月…
Linux操作系统与程序设计课程设计A报告书姓名学号班级专业指导老师提交日期20xx年06月14日1实验项目目的Linux操作系统…
重庆大学课程设计报告课程设计题目学院专业班级年级姓名学号月日成绩指导教师重庆大学教务处制课程设计指导教师评定成绩表张浩20xx53…
《Linux操作系统》课程设计报告题目:Linux对进程和线程的管理机制研究所在院系:软件学院完成学生:**计算机科学与技术指导教…
Linux系统与程序设计课程设计报告书报告人目录1实验项目目的错误未定义书签2实验项目的功能及模块划分23实验项目的人员组成及指责…
sadfawerfreeewwweee实验内容21安装Apache软件22配置www服务器23建立个人web站点24建立虚拟主机2…
eeeasfasdfaswwweee实验内容21安装Apache软件22配置www服务器23建立个人web站点24建立虚拟主机25…
Linux课程设计报告学院信息学院专业班级08级网络二班姓名学号实验目的1通过课程设计对操作系统基本原理进行更深入的认识以Linu…
《Linux操作系统》课程设计报告题目:Linux对进程和线程的管理机制研究所在院系:软件学院完成学生:**计算机科学与技术指导教…
河南大学软件学院河南大学软件学院Linux课程设计方案二零一一年六月1河南大学软件学院1课程设计参加人员与时间11参加人员10级网…