基于 Socket + 进程间通信 + 进程 实现类似百度云的 FTP服务器(非常详细解析)

前言介绍:

FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,FTP是用来在两台计算机之间传输文件,是Internet中应用非常广泛的服务之一。它可根据实际需要设置各用户的使用权限,同时还具有跨平台的特性,即在UNIX、Linux和Windows等操作系统中都可实现FTP客户端和服务器,相互之间可跨平台进行文件的传输。因此,FTP服务是网络中经常采用的资源共享方式之一,顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。FTP类似于百度云。

接下来我们来做一个简单的FTP

功能设计:

功能设想
在这里插入图片描述
在这里插入图片描述

服务器搭建思路

在这里插入图片描述

功能截图:

1.客户端连接服务器
2.客户端查看服务器文件,各种路径和路径下的文件

在这里插入图片描述
1.查看客户端下文件
2.下载服务器文件到客户端
3.上传客户端下文件到服务器

在这里插入图片描述
客户端退出,服务器提示客户端已退出
在这里插入图片描述

部分代码:

服务器代码

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include"config.h"
#include<fcntl.h>
#include<sys/stat.h>

int get_cmd_type(char *cmd)
{
   
     if(!strcmp("ls",cmd))          return LS;
     if(!strcmp("quit",cmd))        return QUIT;
     if(!strcmp("pwd",cmd))         return PWD;
     if(strstr(cmd,"cd")!=NULL)     return CD;
     if(strstr(cmd,"get")!=NULL)    return GET;
     if(strstr(cmd,"put")!=NULL)    return PUT;
     
     return 100;
}

char *getDesDir(char *cmsg)
{
   
      char *p;
      p = strtok(cmsg," ");
      p = strtok(NULL," ");
      return p;
}



void msg_handler(struct Msg msg , int fd)
{
   

    char dataBuf[1024]={
   0};
    char *file = NULL;
    int fdfile;

    printf("cmd : %s\n",msg.data);
    int ret = get_cmd_type(msg.data);

    switch(ret){
   
        case LS:
        case PWD: 
               msg.type = 0;
               FILE *r = popen(msg.data,"r");
               fread(msg.data,sizeof(msg.data),1,r);
               write(fd,&msg,sizeof(msg));
         
               break;
        case CD:
              msg.type = 1;
              char *dir = getDesDir(msg.data);
              printf("dir:%s\n",dir);
              chdir(dir);
              break;

        case GET:
              file = getDesDir(msg.data);

              if(access(file,F_OK) == -1){
   
                             strcpy(msg.data,"NO this File!");
                             write(fd,&msg,sizeof(msg));
              }else{
   
                        msg.type = DOFILE;
                        
                        fdfile = open(file,O_RDWR);
                        read(fdfile,dataBuf,sizeof(dataBuf));
                        close(fdfile);

                        strcpy(msg.data,dataBuf);
                        write(fd,&msg,sizeof(msg));
                   }
                   break;
     
         case PUT:
                 fdfile = open(getDesDir(msg.data),O_RDWR|O_CREAT,0666);
                 write(fdfile,msg.secondBuf,strlen(msg.secondBuf));
                 close(fdfile);
                 break;
         case QUIT:
                 printf("client quit!\n");
                 exit(-1);
    }
}


int main(int argc ,char **argv){
   

int s_fd;
int c_fd;
int n_read;


char readBuf[128];

struct sockaddr_in  s_addr;
struct 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值