FTP——通过套接字网络实现文件的管理

该项目使用C语言在Linux环境中通过套接字网络实现FTP功能,包括账号密码验证、ls指令展示文件信息、get与put指令进行文件传输、cd指令切换目录以及hist查看历史指令。服务端代码为server.c,客户端代码为client.c,项目还包括msg.c、msg.h、list.c、list.h、utils.h和utils.c等组件。账号密码存储在number.txt中,调试信息记录在log文件中。
摘要由CSDN通过智能技术生成

这个项目是在Linux内通过套接字网络和链表实现账号密码登陆,ls指令显示文件名,ls也可以加参数如 ls -l,get指令实现从服务端下载文件到客户端,put指令实现从客户端发送文件给服务端,cd指令实现文件夹切换,hist指令实现查看历史输入指令,当输入quit时退出
话不多说,上我一个礼拜的干货

server.c******服务端

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include "log.h"
#include "msg.h"
#include "utils.h"
#include <unistd.h>
#include <signal.h>
int g_running;
void handle_cmd(struct Msg *incmd, struct Msg *outcmd) {
    FILE *fp = NULL;
    int ret;

    outcmd->cmd = incmd->cmd;

    switch (incmd->cmd) {
        case FTP_CMD_LS:
            fp = popen(incmd->args, "r");
            if (NULL != fp) {
                ret = fread(outcmd->data, 1, sizeof(outcmd->data), fp);
                log_write("ls fread ret %d, eof % d, data % s\n ", ret,
                          feof(fp), outcmd->data);
                pclose(fp);
            }
            break;
        default:
            break;
    }
}
void handle_cmd2(struct Msg *incmd, struct Msg *outcmd) {
    static struct Linklist *hist = NULL;
    log_write("cmd %d, args %s\n", incmd->cmd, incmd->args);
    outcmd->cmd = incmd->cmd;
    // HIST
    listInsert(&hist, incmd->args);
    if (FTP_CMD_LS == incmd->cmd) {
        FILE *fp = popen(incmd->args, "r");
        if (fp != NULL) {
            int ret = fread(outcmd->data, 1, sizeof(outcmd->data), fp);
            log_write("ls fread ret %d, %s", ret, outcmd->data);
            pclose(fp);
        }
    } else if (FTP_CMD_HIST == incmd->cmd) {
        listGetcmd(hist, outcmd->data);
    } else if (FTP_CMD_GET == incmd->cmd) {
        char filename[32];
        if ((splitString(incmd->args, filename)) < 0) {
            outcmd->cmd = FTP_CMD_ERROR;
            log_write("filename isnot exist\n");
            return;
        }

        outcmd->data_length = getLength(filename);
        if (outcmd->data_length == -1 || outcmd->data_length > 5000) {
            log_write("data length is too long or open failure\n");
            return;
        }
        FILE *fp = fopen(filename, "r");
        if (fp != NULL) {
            int ret = fread(outcmd->data, 1, outcmd->data_length, fp);
            log_write("fread ret %d, eof:%d\n", ret, feof(fp));
            fclose(fp);
        }
    } else if (FTP_CMD_PUT == incmd->cmd) {

        char filename[32];
        filename[0] = '+';
        splitString(incmd->args, &filename[1]);
        FILE *fp = fopen(filename, "w");
        if (fp != NULL) {
            int ret = fwrite(incmd->data, 1, incmd->data_length, fp);
            log_write("fwrite ret %d, filename %s, data_length %d", ret,
                     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值