Linux环境下简单实现ftp服务器

本文介绍了服务端编程的基本思路,包括构建网络服务框架,理解API如strtok、popen和chdir的功能,并利用它们进行文件操作。同时,通过封装get_cmd_type函数解析命令类型,实现如ls、pwd、cd、get、put等操作的数据处理函数。对于文件的读写、目录切换以及错误处理进行了详细阐述。
摘要由CSDN通过智能技术生成

服务端编程思路:

1、先完成网络编程下的服务端,形成框架
2、api理解:
A、strtok:用于cd put get 函数获取文件名;
#include <string.h>

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

B、popen: FILE *popen(const char *command, const char *type);

   int pclose(FILE *stream);要用pclose来关闭。
		FILE* fp;
        char ret[1024]={0};
        fp=popen("ps","r");
        int n_read=fread(ret,1,1024,fp);
        printf("byte:%d ret=%s\n",n_read,ret);

        return 0;

C、int chdir(const char *path);
int fchdir(int fd);

chdir()将调用进程的当前工作目录更改为路径中指定的目录。
D、int access(const char *pathname, int mode);//测试文件是否存在:

if(access(file,F_OK) == -1){
           strcpy(msg.cmd,"NO THIS FILE");
           write(fd,&msg,sizeof(msg));
}

3、利用strcmp和strstr封装一个得到类型的函数

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

4、完成数据处理函数封装:

 switch(ret){ 
                case LS:
                case PWD:
                        msg.type=0;
                        FILE* fp=popen(msg.cmd,"r");
                        memset(msg.cmd,0,sizeof(msg.cmd));
                        fread(msg.cmd,sizeof(msg.cmd),1,fp);
                        write(fd,&msg,sizeof(msg));
                        pclose(fp);
                        break;
                case CD:
                        msg.type=1;
                        char* dir=getDesDir(msg.cmd);
                        printf("dir:%s\n",dir);
                        chdir(dir);
                        break;
                case GET:
                        file=getDesDir(msg.cmd);
                        printf("file: %s\n",file);
                        if(access(file,F_OK) == -1){
                                strcpy(msg.cmd,"NO THIS FILE");
                                write(fd,&msg,sizeof(msg));
                        }
                        else{		
                                msg.type=DOFILE;
                                file_fd=open(file,O_RDWR );
                                int N_read=read(file_fd,dataBuf,sizeof(dataBuf));
                                close(file_fd);
                                strcpy(msg.cmd,dataBuf);
                                int N_write=write(fd,&msg,sizeof(msg));
                        }
                        break;
                case PUT:
                        file=getDesDir(msg.cmd);
                        printf("file: %s\n",file);
                        file_fd=open(file,O_RDWR|O_CREAT,0666 );
                        int N_write=write(file_fd,msg.secondBuf,sizeof(msg.secondBuf));
                        close(file_fd);
                        break;
                case QUIT:
                        printf("Client quit!\n");
                        exit(0)}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值