Linux系统学习笔记——ftp项目

服务端server.c

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

int option_cmd(char *cmd)
{
   
        if ( ! (strcmp("ls",cmd)) )
                return LS;
        if ( ! (strcmp("pwd",cmd)) )
                return PWD;
        if ( ! (strcmp("quit",cmd)) )
                return QUIT;
        if ( strstr(cmd,"cd") != NULL  )
                return CD;
        if ( strstr(cmd,"get") != NULL ) // 得到完成命令 如:get config.h
                return GET;
        if ( strstr(cmd,"put") != NULL )
                return PUT;

}

char *GetDir(char *dircmd)
{
   
        char *p;
        p = strtok(dircmd," "); // 以空格为分割标志,分割指令字符串
        p = strtok(NULL," ");   // 以NULL为标记

        
        
        return p;
}

void message_handle(struct Message msg,int fd)
{
   
        char cmdbuf[1024] = {
   0};
        char *file = NULL;
        int file_fd;

        printf("Come from Client cmd is : %s\n",msg.data); // 来自客户端的指令

        int cmd = option_cmd(msg.data); // 把客户端的指令进行筛选分类

        switch(cmd)
        {
   
                case LS:
                case PWD:
                        msg.type = 0;
                        FILE *p = popen(msg.data,"r");  // 把 ls,pwd 命令打开读取数据,并打开内容
                        fread(msg.data,sizeof(msg.data),1,p); //把文件指针 p 中数据读取到msg.data中
                        write(fd,&msg,sizeof(msg)); // 发送数据到客户端进行显示
                        break;
                case QUIT:
                        printf("The Client die out!\n"); // 结束本次连接
                        printf("-------------------------\n");
                        exit(-1);
                case CD:
                        msg.type = 1; // 标记
                        char *dir = GetDir(msg.data); // 分割命令字符串
                        printf("The dir is : %s\n",dir); // 把这个命令打印出来
                        chdir(dir);     // chdir函数直接执行分割出来的指令 如:../
                        break;
                case PUT:
                        file_fd = open(GetDir(msg.data),O_CREAT|O_RDWR,0666);
                          write
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值