重庆大学linux课程设计报告

重庆大学课程设计报告

课程设计题目:

 linux下基于Socket的文件传输程序设计                           

学    院:   计算机学院                              

专业班级:   计算机科学与技术                              

年    级:   20##                             

姓    名:   张浩         周键                             

学    号:   20095396     20095397                            

完成时间:   2012        7       3   

成    绩:                                 

指导教师:    李双庆                             

                                      重庆大学教务处制

课程设计指导教师评定成绩表  :  张浩 20095396

指导教师评定成绩:

指导教师签名:                             年   月   日

课程设计指导教师评定成绩表  : 周键  20095397

指导教师评定成绩:

指导教师签名:                             年   月   日

重庆大学本科学生课程设计任务书

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;

下载服务器下指定路径下的指定文件:download  filename;

上传客户端下指定路径下的指定文件:senddata  filename;

退出连接: end ;

2.4服务器指令

运行服务器后,系统提示指令

查看所有文件请输入  1 ; 重命名文件请输入 2 ; 删除文件请输入 3; 开启服务监听模式 4;

2.5数据流设计

3测试结果

服务器进行文件管理的操作

服务器监听多个客户端并相应其指令

客户端0连接服务器

客户端1连接服务器

4总结

这次课程设计是linux下的socket通信,以c为编程语言,并实现了文件管理与多线程开发。

通过此次课程设计,进一步熟悉了linux操作系统的使用,掌握了linux下socket通信的基本配置,加深了对所学知识的理解,更扩宽了自己的视野,增强动了手实践能力。

5参考资料

《Linux 内核设计与实现》第三版  Robert Love 著

6附录代码

主要服务器代码:

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);

}

相关推荐