基于Linux 下建立的简单FTP 协议

Linux添加FTP用户并设置权限 在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1、环境:ftp为vsftp。被限制用户名为test。被限制路径为/home/test 2、建用户:在root用户下: useradd -d /home/test test //增加用户test,并制定test用户的主目录为/home/test passwd test //为test设置密码 3、更改用户相应的权限设置: 阅读详情

FTP协议:简单来讲就是文本传输协议

实现功能:

1.能够进入指定文件路径  -cd
2.能够查看服务器文件目录      -ls
3.能够上传文件至服务器  -put
4.能够从服务器下载文件  -get
5.能够查看之前对文件的操作  -hist
6.账号密码 验证 
7. - quit退出 

核心思想:

我们要完成上述功能,大致就分为几步。
1.客户端发送指令给服务端
2.服务端接受指令完成指定操作
3.服务端把完成的结果传回客户端

具体实现:

要完成客户端、服务端之间的通信,我们肯定要先构建几个结构体来存放我们想传输的内容

1.建立一个能够存储功能的枚举型结构体  (ls  cd  get  put hist quit)
2.创建一个能够存放文件内容、传输指令、md5效验码等的结构体
3.构造一个分割传输指令的函数 ,为后续操作铺垫 
4.构造一个计算md5效验码的函数
5.构建一个结构体存放账号密码
然后 来讲下指令操作的具体实现 
ls:
1.客户端发送ls指令,服务端接收
2.服务端执行ls指令,获得文件目录,传回客户端
get:
1.客户端发送get指令,服务端接收
2.服务端接收get指令,分割出get后面的文件名,打开文件,读取内容,计算md5值,发送给客户端
3.客户端接收信息,创建新文件,,效验md5值,存放服务端传来的内容
put:
1.客户端分割出put后面的文件名,打开文件,读取内容,计算md5值,发送给服务端端
2.服务端接收put指令,效验md5,存放客户端传来的内容
hist:
1.用头插法创建链表来存储对文件的操作指令
2.遍历链表,用strcat() 来拼接操作指令
3.客户端发送指令,服务端接收
4.服务端添加链表内容,再发回客户端
quit:
按quit退出

难点总结

主要难点是大致实现的思想,只要知道了是怎么大致实现的,接下来都是些小问题
1.我们可以在出错的时候在自己觉得错的地方打印出可能错的内容来调试
2.熟练使用gdb调试,gdb用的好,这些都不是事儿
3.在分割出指令后面的文件名,用字符数组去存放,可能会出错,具体为什么我还没找出来
那么 我就用字符指针存放,这个bug难搞噢

接下来就是代码附上啦。
msg.h

#ifndef MSG_H
#define MSG_H
#define PORT 8883
enum FTP_CMD{  //存放指令
	FTP_CMD_LS=0,
	FTP_CMD_GET=1,
	FTP_CMD_PUT=2,
	FTP_CMD_QUIT=3,
	FTP_CMD_CD=4,
    FTP_CMD_AUTH=5,
    FTP_CMD_HIST=6,
	FTP_CMD_ERROR
};
struct Auth  //存放 账号  密码
{  
    enum FTP_CMD cmd;
    char username[32];
    char password[32];
};

struct Msg  
{
	//command  get 
	enum FTP_CMD cmd;  //存放指令
	
	//command de canshu get test.c
	char args[32];  //存放对文件的操作
	
	//md5
	char md5[64];  //存放md5效验码
	
    //data length
    int data_length;  //存放文件长度

	//test.c content i don't know length
	char data[5000];  //存放文件内容
	
};
#endif

link.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"link.h"
void linkinit(struct LINKLIST **head,char *cmd) //链表初始化
{
    struct LINKLIST *node=(struct LINKLIST *)malloc(sizeof(struct LINKLIST));
    node->next=NULL;
    strcpy(node->cmd,cmd);

    node->next=*head;  //头插法
    *head=node;
}
void print_link(struct LINKLIST *head) //打印链表信息
{
    struct LINKLIST *p=head;
    while(p!=NULL)
    {
        printf("%s",p->cmd);
        p=p->next;
    }
}
void get_link(struct LINKLIST *head,char *cmd)  //从链表中获取操作指令
{
    struct LINKLIST *p=head;
    
    while(p!=NULL)
    {
       // p=p->next;
        strcat(cmd,p->cmd);  //拼接链表内容
        p=p->next;
    }
}

unils.c

#include<string.h>
#include<sys/types.h>
#include<stdio.h>
int division_buf(char *inbuf,char *outbuf)
{
    char *first=strstr(inbuf," ");

    while(1)
    {
        if(first=="\0"||first==NULL)
        {
            return -1;
        }
        first+=1;
        if(*first!=' ')
        {
            break;
        }
    }
    strncpy(outbuf,first,strlen(first)-1);
    return 0;
}
long get_length(char *filename)
{
    long length;
    FILE *fp=fopen(filename,"r");
    if(fp!=NULL)
    {
        fseek(fp,0,2);
        length=ftell(fp);
        rewind(fp);
    }
    else 
    {
        return -1;
    }
    fclose(fp);
    return length;
}
void get_md5(char *filename,char *md5)
{
    char buf[64];
    char cmd[64];
    sprintf(buf,"md5sum %s",filename);
    FILE *fp=popen(buf,"r");
    if(fp!=NULL)
    {
        fread(cmd,1,sizeof(buf),fp);
    }
    strncpy(md5,cmd,32);
    fclose(fp);

}

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 <unistd.h>
#include "msg.h"
#include "log.h"
#include "unils.h"
#include <signal.h>
#include "link.h"
int ssc;

void handle_cmd(struct Msg *incmd, struct Msg *outcmd) {
    static struct LINKLIST *head=NULL;
    linkinit(&head,incmd->args);
//    print_link(head);
    if (incmd->cmd == FTP_CMD_LS) {
        FILE *fp = popen(incmd->args, "r");
        if (fp != NULL) {
            int net = fread(outcmd->data, 1, sizeof(outcmd->data), fp);
        }
        pclose(fp);
    } else if (incmd->cmd == FTP_CMD_HIST) {
        char buf[1024]={0};
        get_link(head,buf);
        printf("buf=%s",buf);
        strcpy(outcmd->args,buf);
        printf("outcmd->args=%s\n",outcmd->args);
    } else if (incmd->cmd == FTP_CMD_GET) {
        char filename[32];
        filename[0] = '_';
        if (division_buf(incmd->args, &filename[1]) == -1) {
            outcmd->cmd = FTP_CMD_ERROR;
            log_write("don't find file\n");
            return;
        }
        strcpy(outcmd->args, filename);
        char *p = &filename[1];
        outcmd->data_length = get_length(p);
        if (outcmd->data_length > 5000 || outcmd->data_length == -1) {
            return;
        }
       // get_md5(p,outcmd->md5);
      //  log_write("outcmd->md5=%s\n",outcmd->md5);
        FILE *fd = fopen(p, "r");
        if (fd != NULL) {
            fread(outcmd->data, 1, outcmd->data_length, fd);
        } else {
            outcmd->cmd = FTP_CMD_ERROR;
            log_write("don't find file\n");
            return;
        }
        fclose(fd);
        get_md5(p,outcmd->md5);
        log_write("outcmd->md5=%s\n",outcmd->md5);
    } else if (incmd->cmd == FTP_CMD_PUT) {
        char filename[32];
        char md5[64];
        filename[0] = '+';
        if (division_buf(incmd->args, &filename[1]) == -1) {
            log_write("don't find file\n");
            return;
        }
        FILE *fd = fopen(filename, "w");
        fwrite(incmd->data, 1, incmd->data_length, fd);
        fclose(fd);
        get_md5(filename, md5);
           log_write("incmd->md5=%s\n",incmd->md5);
           printf("%s\n",md5);
           printf("%s\n",incmd->md5);
           if(strcmp(incmd->md5,md5)!=0)
           {
               remove(filename);
           }
    } else if (incmd->cmd == FTP_CMD_QUIT) {
        ssc = 0;
    } else if (incmd->cmd == FTP_CMD_CD) {
        char *name=malloc(sizeof(char));
        if (division_buf(incmd->args, name) == -1) {
            return;
        }
        printf("incmd->args=%s",incmd->args);
        printf("cdname=%s\n",name);
        chdir(name);
    }
}
int main(int argc, char const *argv[]) {
    int s_fd;
    int c_fd;
    int ret;
    int addr_len;
    struct sockaddr_in s_addr;
    struct Msg *msg_send = malloc(sizeof(struct Msg));
    struct Msg *msg_recv = malloc(sizeof(struct Msg));

    log_creat("zzz.txt");
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1) {
        log_write("socket error\n");
        exit(-1);
    }

    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(PORT);
    s_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr)) == -1) {
        log_write("bind error\n");
        exit(-1);
    }

    if (listen(s_fd, 10) == -1) {
        log_write("listen error\n");
    }

    addr_len = sizeof(struct sockaddr);
    c_fd = accept(s_fd, (struct sockaddr *)&s_addr, &addr_len);
    if (c_fd < 0) {
        log_write("accept error\n");
        exit(-1);
    }

    struct Auth in_user;
    struct Auth out_user;
    char user_name[32];
    char pass_word[32];

    recv(c_fd, &in_user, sizeof(struct Auth), 0);
    FILE *fp = fopen("user.txt", "r");
    fscanf(fp, "%s %s", user_name, pass_word);
    log_write("username=%s,password=%s\n", user_name, pass_word);
    log_write("inname=%s,inword=%s\n", in_user.username, in_user.password);
    int a = strcmp(user_name, in_user.username);
    log_write("length=%d\n", a);
    if (strcmp(user_name, in_user.username) != 0 ||
        strcmp(pass_word, in_user.password) != 0) {
        log_write("hello\n");
        out_user.cmd = FTP_CMD_ERROR;
        send(c_fd, &out_user, sizeof(struct Auth), 0);
        exit(-1);
    }
    out_user.cmd = FTP_CMD_AUTH;
    send(c_fd, &out_user, sizeof(struct Auth), 0);
    fclose(fp);
    ssc = 1;
    while (ssc) {
        memset(msg_recv, 0, sizeof(struct Msg));
        memset(msg_send, 0, sizeof(struct Msg));
        ret = recv(c_fd, msg_recv, sizeof(struct Msg), 0);
        log_write("recv from server=%d\n", ret);

        handle_cmd(msg_recv, msg_send);

        ret = send(c_fd, msg_send, sizeof(struct Msg), 0);
    }
    log_distory();
    return 0;
}

client.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 <unistd.h>
#include <signal.h>
#include <netdb.h>
#include "log.h"
#include "msg.h"
#include "unils.h"
#include "link.h"
int input_msg(struct Msg *msg) {
    char buf[32];
    enum FTP_CMD cmd;

    printf("input command\n");
    fgets(buf, 32, stdin);
    log_write("buf=%s", buf);
    if (memcmp(buf, "ls", 2) == 0) {
        cmd = FTP_CMD_LS;
    } else if (memcmp(buf, "get", 3) == 0) {
        cmd = FTP_CMD_GET;
    } else if (memcmp(buf, "put", 3) == 0) {
        cmd = FTP_CMD_PUT;
        if (division_buf(buf, msg->args) == -1) {
            return -1;
        }
        msg->data_length = get_length(msg->args);
        if (msg->data_length > 5000 || msg->data_length == -1) {
            return -1;
        }
        get_md5(msg->args, msg->md5);
//        log_write("msg->md5=%s\n", msg->md5);
        FILE *fp = fopen(msg->args, "r");
        if (fp != NULL) {
            fread(msg->data, 1, msg->data_length, fp);
        } else {
            return -1;
        }
        fclose(fp);
    } else if (memcmp(buf, "quit", 4) == 0) {
        cmd = FTP_CMD_QUIT;

    } else if (memcmp(buf, "cd", 2) == 0) {
        cmd = FTP_CMD_CD;
    } else if (memcmp(buf, "hist", 4) == 0) {
        cmd = FTP_CMD_HIST;
    } else {
        cmd = FTP_CMD_ERROR;
    }

    if (cmd == FTP_CMD_ERROR) {
        return -1;
    }

    msg->cmd = cmd;
    strcpy(msg->args, buf);
    return 0;
}
int main(int argc, char const *argv[]) {
    int c_fd;
    int ret;
    char buf[128];
    struct sockaddr_in c_addr;
    struct Msg *msg_send = malloc(sizeof(struct Msg));
    struct Msg *msg_recv = malloc(sizeof(struct Msg));
    log_creat("client.txt");
    c_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (c_fd == -1) {
        log_write("client socket error\n");
        exit(-1);
    }
    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    c_addr.sin_family = AF_INET;
    c_addr.sin_port = htons(PORT);
    inet_aton("192.168.58.131", &c_addr.sin_addr);

    if (connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)) ==
        -1) {
        log_write("connect failed\n");
        exit(-1);
    }
    log_write("connect succes from client\n");

    struct Auth auth_send;
    struct Auth auth_recv;

    printf("input username:\n");
    scanf("%s", auth_send.username);
    printf("input password:\n");
    scanf("%s", auth_send.password);

    send(c_fd, &auth_send, sizeof(struct Auth), 0);

    recv(c_fd, &auth_recv, sizeof(struct Auth), 0);

    if (auth_recv.cmd == FTP_CMD_ERROR) {
        return;
    }
    while (1) {
        memset(msg_recv, 0, sizeof(struct Msg));
        memset(msg_send, 0, sizeof(struct Msg));
        if (input_msg(msg_send) == -1) {
            continue;
        }
        ret = send(c_fd, msg_send, sizeof(struct Msg), 0);
        log_write("send=%d\n", ret);
        ret = recv(c_fd, msg_recv, sizeof(struct Msg), 0);
        if (msg_send->cmd == FTP_CMD_LS) {
            printf("%s\n", msg_recv->data);
        } else if (msg_send->cmd == FTP_CMD_GET) {
          //  char md5_buf[64];
            if (msg_recv->cmd == FTP_CMD_ERROR) {
                continue;
            }
            char md5_buf[128];
            FILE *fd = fopen(msg_recv->args, "w");
            fwrite(msg_recv->data, 1, msg_recv->data_length, fd);
            printf("%d\n", msg_recv->data_length);
            fclose(fd);
            get_md5(msg_recv->args,md5_buf);
            log_write("msg_recv->args=%s\n",md5_buf);
            log_write("msg_recv->md5=%s\n",msg_recv->md5);
            if(strcmp(msg_recv->md5,md5_buf)!=0)
            {
                  remove(msg_recv->args);
             }
            
        } else if (msg_send->cmd == FTP_CMD_QUIT) {
            break;
        } else if (msg_send->cmd == FTP_CMD_HIST) {
            printf("%s\n", msg_recv->args);
        }
    }

    log_distory();
    return 0;
}

Ews(ExchangeWebService)Api使用说明 打个小广告:作者博客地址:http://nbsanke.top:68 本文未完善,持续更新中 Java EwsApi地址: GitHub链接 Ews 官方说明文档 接口说明地址:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.exchange.webservices.data?view=exchange-ews-api c#版Api教程及... 阅读详情

相关推荐

Linux与Windows FTP服务器的配置及其文件的上传与下载。

(1)、在Windows上建立FTP协议 ①在控制面板内打开“程序功能”,出现下面界面,点击“打开或关闭Windows功能”。 ②勾选“Internet 信息服务”下的“FTP服务器”等全部选项。 ③点击“确定”等待系统自动安装成功。 ④在“控制面板”内点击“管理工具”找到“Internet信息服务管理器” ⑤添加FTP站点 ⑥进入计算机管理,在用户中给Administrator设置密码。 ⑦在浏览器搜索栏上搜索ftp://10.10.30.5检查你的FTP站点是否建成。 出现下列图标,则

Simple_535的博客 739

Linux FTP搭建及访问

1.简单FTP构建及访问 问题 本案例要求先快速搭建好一台FTP服务器,并创建相关测试文件: 建立下载测试文件 /var/ftp/pub/anon.txt 建立下载测试文件 ~lisi/lisi.txt 然后验证以不同方式从客户机访问此FTP服务器: 从浏览器访问,测试匿名/用户登录 以ftp命令访问,分别测试匿名/用户验证访问的下载和上传操作 使用wget命令下载测试文件 方案 使用2台RH...

iT__SuperMan的博客 1万+

shell - 基于PPP协议的linux与Windows CE网络

在Windows CE设备端需要做的配置相对来说比较简单。然后 我们重新建立一个连接,在开始菜单种选择"程序->通讯->连接管理器",然后点击 "新建连接"图标,将新的连接命名为linux 并指定连接类型为"直线连接",在下一 步中指定使用COM1进行连接并设置其通讯速率为115,200,在TCP/IP 设置中指定该 设备的IP为90.0.0.2。如果有读者使用的是Windows 9x/2000/NT主机,那么也可以利用Windows 提供 的直线电缆连接功能与Windows CE设备建立起PPP连接。

m0_37449634的博客 215

Linux系统ftp协议

1、定义 ftp:// ##文件传输协议 2、布置服务 vim /etc/sysconfig/selinux SELINUX=disabled reboot getenforce Disabled 配置yum源 安装lftp 关闭防火墙 安装vsftpd yum install vsftpd -y systemctl start vsftpd systemctl enable vsftpd ...

Dead_LS的博客 349

Linux (基于TX2) FTP文件上传教程

C++作为一种高效、灵活的编程语言,它在系统级编程方面尤为突出,其中网络编程是其强项之一。网络编程的核心在于构建能够在网络上相互通信的程序。C++实现网络编程主要有以下几种基础库::这是一个历史悠久的网络API,广泛应用于UNIX和类UNIX系统中。它提供了一组接口,允许程序使用TCP或UDP协议进行通信。尽管Berkeley sockets最初是用C语言设计的,但它与C++兼容性良好。Boost.Asio:Boost.Asio是一个跨平台的C++库,它简化了异步输入/输出编程。

weixin_35238815的博客 1146

Linux C语言开发FTP服务器程序实战指南

本文还有配套的精品资源,点击获取 简介:本项目着重于使用Linux C语言实现一个FTP服务器程序,涉及操作系统底层、网络通信和并发处理。该程序遵循FTP协议,包括控制通道和数据通道的建立,文件传输,以及断点续传。同时,需处理多线程并发请求,并考虑安全性,支持SSL/TLS加密。该程序可作为深入理解网络编程和提高C语言技能的实践项目。 1. FTP协议原理与工作方...

weixin_42509888的博客 1891

Linux FTP服务器与客户端(FTP命令 C/C++代码实现)

FTP 是 TCP/IP 提供的标准互联网协议,用于将文件从一台主机传输到另一台主机。它主要用于将网页文件从其创建者传输到充当 Internet 上其他计算机的服务器的计算机。它还用于将文件从其他服务器下载到计算机。为什么需要文件传输协议?文件传输协议 (FTP) 是最古老的 Internet 协议之一。 协议背后的思想是通过命令触发下载和上传。 允许将文件从你自己的设备传输到服务器,反之亦然。在 FTP 连接中,通常打开两个通道。 首先,客户端和服务器使用端口 21 建立命令通道。客户端使用该通道向服务器

chen1415886044的博客 9113

别再只看成交量了!用通达信这个VOL监测公式,一眼识别主力吸筹与出货信号

本文详细介绍了通达信VOL监测公式的实战应用,通过彩色量柱和换手率分层技术,帮助投资者识别主力吸筹与出货信号。该公式结合动态量能标准化和多周期均线组合,提供可视化主力行为图谱,提升交易决策的准确性。

weixin_28693447的博客 657

从零开始理解二极管限幅:5种典型电路设计及实际应用场景解析

本文系统解析了二极管限幅电路的五大经典拓扑,包括串联与并联型上下限幅及双向限幅。通过剖析其核心原理与二极管的单向导电性、正向压降特性,结合ADC输入保护、电源管理、音频处理等实际应用场景,提供了从器件选型到设计陷阱规避的完整实战指南,帮助工程师为信号构建可靠的“安全笼”。

2y3u4i5o6p的博客 1034

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

[ZT]用SRP建立安全的Linux FTP服务器

作者: 曹江华   出处: 天极网    责任编辑: 原野   [ 2005-09-29 08:53 ]在中小型异构网络中,很多用户选择Linux作为网络操作系统,利用其简单的配置和用户熟悉的图形界面提供Internet服务,FTP便是其提供的服务之一。在众多网络应用中,FTP(文件传输协议)有着非常重要的地位。互联网一个十分重要的资源就是软件资源,而各种各样的软件资源大多数都放在FTP服务器中。

jadew的专栏 1463

BLDC控制实验:方波、霍尔、开环、定速、正转

本文记录博主学习BLDC控制软件的过程。 文章目录1 概述2 软件架构及工具链2.1 软件架构2.2 工具链3 底层代码生成3.1 时钟配置3.2 按键输入配置 1 概述 本文是博主第一次做BLDC控制实验,目的仅仅是写代码让BLDC转起来,而暂时不考虑其他复杂的需求。 控制的方法是比较简单的六步换相法。利用电机内部的霍尔传感器,通过参考电机厂家给出的二二导通换相表,生成方波来控制电机。第一次实验为了简化需求,只考虑开环、定速、正转的情况: 开环:不考虑速度反馈,直接给PWM让电机转起来; 定速:不考虑速

u013288925的博客 1万+

linux中ftp的毕业论文引言,论文范文:简谈上传Linux环境下FTP系统的设计与实现论文格式范例-计算机毕业论文题目-808毕业论文网...

摘要4-5Abstract5-11第1章 引言11-161.1 课题背景及作用11-131.2 课题主要工作13-141.3 论文的组织结构14-16第2章 LINUX 下 FTP 系统的实现平台16-262.1 设计案例概述162.2 硬件系统概述16-172.3 LINUX 操作系统概述—UBUNTU17-252.3.1 UBUNTU 操作系统内核18-192.3.2 文件系统在 FTP 中的...

weixin_33309048的博客 391

SAP Fiori Elements 扩展实战:UI 层扩展、OData 服务扩展、CDS 视图增强及全流程案例

UI 层扩展主要关注在不修改标准生成界面的基础上,自定义用户界面元素和交互逻辑。典型需求包括:在现有 Fiori Elements 界面上添加新的字段(如表格列或表单项)、增加自定义按钮并绑定操作、以及通过控制器扩展加入事件处理等。无论在 RAP 还是传统 BOPF 架构下,前端 UI 扩展通常采用 SAPUI5 提供的**扩展点(Extension Points)和控制器扩展(Controller Extension)**机制来安全地插入自定义代码。下面分别说明两种后端架构下 UI 扩展的实现方式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 900

远程声控系统(MATLAB代码见优快云资源)

远程声控系统技术报告 一、题目要求 实现一个远程声音控制系统。首先采集不同的语音指示信号,进行适当压缩;然后通过噪声信道实现远程传输,远端接收后再通过适当计算识别出是何指示,最后送入一个处于未知状态、但能控/能观的控制系统,完成不同的控制动作。 二、问题分解与解决思路 2.1 系统设计 实验中以汉语数字语音1~9作为指令,数字语音“1”代表一号指令,数字语音“2”代表二号指令,依次类推。发送端发出语音“1”,发送端对应的数字语音文件为“1b.wav”,通过信源编码对语音进行压缩编码,然后进行信道编码并进行基

业精于勤,荒于嬉 5734

FTP 和 SFTP,MobaXterm 和 FileZilia

文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。 SFTP是Secure File Transfer Protocol的缩写,安全文件传输协议。可以为传输文件提供一种安全的网络的加密方法。 字面意思,FT

caicau的博客 2266

基于STM32的汽车主门电动窗开关系统设计方案

以下是基于 STM32CubeMX 和 HAL 库的示例代码,可实现基本的功能。

weixin_42300449的博客 994

在计算机网络中ftp服务器的用途是,FTP的作用以及传输文件的一般步骤

FTP即文件传输协议,是互联网最早的也是最基本的网络协议之一。那FTP的作用是什么?要如何使用FTP?接下来小编就为大家一一介绍。1、FTP定义FTP(File Transfer Protocal),是TCP/IP协议组中的协议之一,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,...

weixin_31602525的博客 3809

ARM功耗管理软件之DVFS&AVS

思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

AI-安全-功耗 1230

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

FTP 客户端C实现

使用 Socket 通信实现 FTP 客户端程序 FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。 在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上的程序只要符合 FTP 协议,就可以相互...

y673533511的博客 1100

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

基于PPP协议的linux与Windows CE网络(转)

基于PPP协议的linux与Windows CE网络(转)[@more@]本文介绍了通过网络实现 linux 主机与 Windows CE 设备协同工作的方法。本文首先利用 PPP 协议在 Linux 主机与 Windows C...

288

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ftp服务器协议实验报告,FTP实验报告

FTP实验报告1、 实验目的本实验要求在linux系统上完成一个文件传输协议,通过本实验,不但可以深入理解FTP协议的原理和细节,还可以学会利用Socket接口设计实现简单应用层协议,掌握网络应用程序的基本设计方法和实验技巧。2、 实验说明文件传输协议用于两台计算机之间传递文件,FTP包含了两个通道。一个是控制通道,一个是数据通道。控制通道是和FTP服务器进行沟通的通道,连接服务器,发送指令。数据...

weixin_39878401的博客 1170

linux内核netfilter之ip_conntrack模块的作用举例--ftp为例

很多协议的控制信息在应用层数据中被包含,这些信息直接影响到了链路的建立,比如ftp协议就是这样,ftp分为port模式和pass模式,port模式中,起初client连接server的21端口,然后当需要传输data的时候,client发送一个控制包给server,包中包含client端开启的端口和自己的ip地址,server收到之后用自己的20端口去连接client控制包中建议的ip和端口,在这...

totoxian 126

C语言实现Linux FTP服务器:从协议解析到并发架构实战

网络编程是构建现代分布式系统的基石,其核心在于理解客户端与服务器之间通过套接字(Socket)进行通信的原理。在众多应用层协议中,FTP(文件传输协议)因其经典的双连接架构——分离的控制连接与数据连接,成为深入学习网络服务并发模型、协议解析和系统编程的绝佳范例。通过用C语言在Linux平台上实现一个FTP服务器,开发者能够透彻掌握多进程/多线程并发处理、TCP套接字编程、文件I/O以及用户会话状态管理等核心技术,这些技能对于构建高性能、高可靠的后端服务至关重要。本项目实战指南将聚焦于被动模式(PASV)的实

weixin_29170327的博客 261
上一篇: Linux-信号量配合父子进程的简单使用
下一篇: HC-SR04超声波测距 - 树莓派3B
四夕、
博客等级 码龄8年 19粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值