Linux 网络编程项目--简易ftp

Linux进阶-FTP服务器源码搭建(pureftpd) 本文介绍的是centos7版本的Linux系统基础知识 作者:lxy FTP介绍 在互联网上提供文件存储和访问服务的计算机,FTP可以用来在两台计算机之间传输文件 安装FTP(源码安装pureftpd) **关闭防火墙:systemctl stop firewalld 关闭SELinux(连接上传时必须关闭) setenforce 0 安装所需依赖及编译工具 yum install -y gcc... 阅读详情

主要代码

config.h


#define LS     0
#define GET    1
#define PWD    2

#define IFGO   3

#define LCD    4
#define LLS    5
#define CD     6
#define PUT    7

#define QUIT   8
#define DOFILE 9


struct  Msg
{
   int type;
   char data[1024];
   char secondBuf[128];
};

服务器:

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

int get_cmd_type(char *cmd)
{
    if (!strcmp("ls", cmd))
        return LS; // 这里类命令没有参数直接strcmp 比较即可
    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;
}

char *getDesDir(char *cmsg) // 获取后段字符串 --- 参数
{
    char *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:
        // popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。
        FILE *r = popen(msg.data, "r");
        fread(msg.data, sizeof(msg.data), 1, r);
        write(fd, &msg, sizeof(msg)); // 写入socket通道的 fd
        break;
    case CD:
        char *dir = getDesDir(msg.data);
        printf("dir: %s\n", dir);
        chdir(dir);

        break;

    case GET:
        msg.type=DOFILE;
        file = getDesDir(msg.data); //// 获取后段字符串 --- 参数 -文件名
        if (access(file, F_OK) == -1)
        {                                       // access 判断文件是否存在
            strcpy(msg.data, "No this  file!"); ////将 "no this file"的信息写入data,并且write返回给客户端
            write(fd, &msg, sizeof(msg));
        }
        else
        {
            // 存在,打开服务器目录下的文件,读取里面的内容,写入到客户端文件中
            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); // 以可读可写的形式创建 需要put的文件,给0666的权限 -- 可读可写
        write(fdfile, msg.secondBuf, strlen(msg.secondBuf));        //// 向新创建的文件中写入数据,secondBuf
        close(fdfile);

        break;
    case QUIT:
        puts("Client Quit!");
        exit(-1);
    }
}

int main(int argc, char **argv)
{
    int s_fd;
    int c_fd;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;
    int nread;
    // char msg[128]={0};
    struct Msg msg;
    char readBuf[128] = {0};
    if (argc != 3)
    { // 判断传参是否正确
        puts("Improper parameters");
        exit(-1);
    }
    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化bind需要的struct

    s_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    s_addr.sin_port = htons(atoi(argv[2])); // 通过传参指定端口
    // a -- ASCLL  传参方式得到IP
    inet_aton(argv[1], &s_addr.sin_addr);

    // 3.bind
    bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));
    // listen
    listen(s_fd, 10);
    // 4.accept
    while (1)
    {
        c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen); // 获得新的客户端 描述符
        if (c_fd == -1)
        {
            perror("accept");
        }

        printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

        if (fork() == 0)
        { // 接入新的客户端 创建子进程来处理读

            while (1)
            {
                // read()
                memset(msg.data, 0, sizeof(msg.data));
                nread = read(c_fd, &msg, sizeof(msg));
                if (nread == 0)
                {
                    printf("client  out\n"); // 读取时已经到达文件的末尾,则返回0。表示客户端退出
                    break;
                }
                else if (nread > 0) // 读取成功
                {
                    msg_handler(msg, c_fd);
                }
            }
        }
    }
    close(c_fd);
    close(s_fd);

    return 0;
}

客户端:

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

int get_cmd_type(char *cmd)
{
    if (strstr(cmd, "lcd"))
        return LCD;

    if (strstr(cmd, "cd"))
        return CD;
    if (strstr(cmd, "get"))
        return GET;
    if (strstr(cmd, "put"))
        return PUT;

    if (!strcmp("quit", cmd))
        return QUIT;
    if (!strcmp("ls", cmd))
        return LS;
    if (!strcmp("lls", cmd))
        return LLS;
    if (!strcmp("pwd", cmd))
        return PWD;
    return -1; //  找不到这个指令就放回-1
}

char *getdir(char *cmsg) // 获取后段字符串 --- 参数
{
    char *p = strtok(cmsg, " ");
    p = strtok(NULL, " ");
    return p;
}

int cmdHanler(struct Msg msg, int fd)
{
    char buf[32];
    char *dir = NULL;
    int ret;
    int fdfile;
    ret = get_cmd_type(msg.data);

    switch (ret)
    {
    case LS:
    case CD:
    case PWD:
        write(fd, &msg, sizeof(msg));
        break;

    case GET:
        write(fd, &msg, sizeof(msg));
        break;
    case PUT:
        strcpy(buf, msg.data);
        dir = getdir(buf);
        if (access(dir, F_OK) == -1)
        {
            printf("%s not exit\n", dir);
        }
        else
        {
            fdfile = open(dir, O_RDWR);
            read(fdfile, msg.secondBuf, sizeof(msg.secondBuf)); //// 客户端把数据读到secondBuf里面
            close(fdfile);
            write(fd, &msg, sizeof(msg)); // 将内容写给服务器fd
        }
        break;
    case LLS:
        system("ls");
        break;
    case LCD:
        dir = getdir(msg.data);
        chdir(dir);
        break;
    case QUIT:
        strcpy(msg.data, "quit");
        write(fd, &msg, sizeof(msg));
        close(fd);
        exit(-1);
    }
return ret;
}

void  handlerServerMessage(int c_fd,struct Msg msg){
 int nread;
 struct Msg msgget;
 int newfdfile;
 nread=read(c_fd,&msgget,sizeof(msgget));
 if(nread==0){
    printf("server is out,quit\n");
    exit(-1);
 }
 else if(msgget.type == DOFILE)
 {
  char *p=getdir(msg.data);
   newfdfile=open(p,O_RDWR|O_CREAT,0600); 
  write(newfdfile,msgget.data,strlen(msgget.data));
  putchar('>');
  fflush(stdout);

 }
else{
printf("----------------------------------\n");
printf("\n%s\n",msgget.data);
printf("----------------------------------\n");

  putchar('>');
  fflush(stdout);

}




}

int main(int argc, char **argv)
{
    int c_fd;
    struct sockaddr_in c_addr;
    struct Msg msg;
    int nread;
    if (argc != 3)
    { // 判断传参是否正确
        puts("Improper parameters");
        exit(-1);
    }
    // char msg[128] = {0};
    char readBuf[128];

    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    c_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (c_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化bind需要的struct

    c_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    c_addr.sin_port = htons(atoi(argv[2]));
    // a -- ASCLL
    inet_aton(argv[1], &c_addr.sin_addr);

    // 2.connect -- 阻塞等待连接
    int p_c = connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in));
    if (p_c == -1)
    {
        perror("connect");
        exit(-1);
    }

    printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

    while (1)
    { // 我们希望能一直读写 -- 实现聊天功能
        memset(msg.data, 0, sizeof(msg.data));
        gets(msg.data); // 一直 获取 命令输入
        int ret = cmdHanler(msg, c_fd);

        if (ret > IFGO)
        {
            putchar('>');
            fflush(stdout);
            continue;
        }
        if (ret == -1)
        {
            puts("command not");
            putchar('>');
            fflush(stdout);
            continue;
        }
        handlerServerMessage(c_fd, msg);
    }

    return 0;
}

代码解析:

基本命令

如下图: 

我们在客户端中将LS PWD CD命令写入msg,到服务器这边就会读取他们的值

msg.data 的第一段子串是命令,第二串是参数 -- 比如 cd .. 

ls,pwd只有命令,调用popen来调用

popen()函数补充



  popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。

  这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。

也就是,popen创建管道,执行shell命令将文件流中的某些数据读出

get

服务器先将文件写入msg中

客户端再通过msg获取

 //这个函数用来读取我们的文件指令

 if 类型是文件操作 FOFILE,就创建创建文件向其中写入数据,这样就得到了服务器的文件 --GET

else 直接将操作打印出来 


 

put:

如下图,先从客户端开始说,客户端先确保,文件存在,然后将文件打开,将文件内容读取到secondBuf里面,关文件,写入fd(服务器)的msg中。

服务器,直接创建一个文件来接收我们刚刚传过来的数据,写入文件,关文件。

_access()函数补充


头文件:#include<io.h>
函数原型:int _access(const char *pathname, int mode);
参数:pathname 为文件路径或目录路径,mode 为访问权限
返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1

lcd:

读取到dir 为第二个子串 -- 参数

调用chdir 跳转即可

chdir()函数 补充


系统调用 chdir()和 fchdir()可以用于更改进程的当前工作目录,函数原型如下所示:

#include <unistd.h>

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

首先,使用这两个函数之一需要包含头文件<unistd.h>
函数参数和返回值含义如下:
path:将进程的当前工作目录更改为 path 参数指定的目录,可以是绝对路径、也可以是相对路径,指定的目录必须要存在,否则会报错。
fd:将进程的当前工作目录更改为 fd 文件描述符所指定的目录(譬如使用 open 函数打开一个目录)。
返回值:成功均返回 0;失败均返回-1,并设置 errno。

// 其余细节,还请读者看代码注释

FTP客户端程序源码 FTP客户端程序源码     简单实现了FTP客户端的大体功能,本程序虽存在bug,有些地方设计的也不是多好,但FTP客户端登录,上传,下载等基本功能还是有的,把源码记录下来,供以后参考。     客户端在虚拟机下ubantu实现,服务器用的windows下的Filezilla。     执行程序:ubantu下 ./a.out+windows下的IP地址。 源码程序如下: 阅读详情

相关推荐

Linux网络编程小项目-----FTP服务器

FTP是File Transfer Protocol(文件传输协议)。Linux网络编程下实现的FTP服务器项目分为客户端和服务端,该项目主要是实现客户端对服务器上的文件内容进行展示、显示路径、删除、上传、下载等功能,以及对客户端本身文件进行展示、显示路径、删除文件等功能。客户端远程功能展示服务端有哪些文件——ls显示服务端当前路径——pwd进入服务端哪个文件——cd删除服务端文件——rm file下载服务端文件——get file上传文件到服务端——put file。

weixin_45637109的博客 1114

linux ftp服务源代码,linux下最简单的ftpget ftpput 源代码

/*FtpGetRun*/#include #include #include #include #include #include #include #include #include /*FtpGetRun Variable*/FILE *pFtpIOFile = NULL;FILE *pFileCmdChmod; //使用popen方式修改文件属性为可执行的文件指针FILE *...

weixin_31225753的博客 1121

Linux基础之网络编程

1)进程间通信的方式有**:管道,消息队列,共享内存,信号,信号量这么集中2)特点:依赖于linux内核,基本是通过内核来实现应用层的两个进程间的通信3)缺陷:无法多机通讯1)网络编程适用去不同的pc间的通信,可以实现多机运行地址和数据地址是指:IP地址和端口号。每台PC机连网够都有一个IP地址,那么每台联网的PC机可能跑多个服务器,然后每个服务器中对应的有很多进程。当客户端接入的时候,不知道去对接哪个服务器。那么这时端口号对应的就是每个服务器的端口。客户就可以通过端口号连接到对应的服务器了。

weixin_55374007的博客 2556

Linux 网络编程项目 —— FTP 网盘

1. LS —— 展示服务端文件,用法:lls 2. PWD —— 展示服务端的当前路径,用法:pwd 3. CD —— 用于切换服务端的路径,用法:cd path 4. RM —— 用于删除服务端的文件,用法:rm file 5. GET —— 下载服务端文件至客户端本地,用法:get file 6. PUT —— 把客户端本地文件上传至服务端,用法:put file

Outside_的博客 3459

迷你Ftp服务器:轻量级FTP解决方案

本文还有配套的精品资源,点击获取 简介:FTP服务器是一种用于在计算机间传输文件的互联网协议。迷你Ftp服务器是一款体积小(仅33K)且易于使用的轻量级服务软件,它提供了基本的FTP服务功能,适合快速建立FTP服务的用户。尽管简单,迷你Ftp服务器提供了文件上传下载服务、简易的安装配置、基本的安全性、快速的数据传输、详尽的使用帮助、良好的兼容性以及基本的监控与日志功能。对于...

weixin_33759613的博客 3082

Linux环境下的ibftp3.1 FTP客户端开发与应用

文件传输协议(FTP)是互联网上用来传输文件的协议,它为客户端和服务器之间提供了可靠、高效的数据传输方法。作为一个标准的、开放的网络协议,FTP使用客户端-服务器模型和TCP可靠的数据传输服务,确保文件可以安全地从一台主机传输到另一台主机。FTP支持各种文件类型,包括文本文件、二进制文件、程序代码和图像等。libftp3.1库是C语言开发中用于实现FTP协议功能的第三方库。它封装了底层FTP通信过程中的复杂性,提供了简洁的接口供程序员调用,从而能够轻松地实现文件上传下载等操作。

weixin_36304957的博客 811

Linux网络编程--FTP云盘项目

FTP就是文件传输协议。用于互联网双向传输,控制文件下载空间在服务器复制文件从本地计算机或本地上传文件复制到服务器上的空间。

lijianhua003的博客 630

简易个人迷你FTP服务器

这个FTP服务器是用C语言开发的,其特点是界面精美,易于使用,还有信息流量统计。整个FTP服务器就是一个EXE可执行程序, 无需任何安装,不修改注册表,删除时直接删除所有相关文件就行了。程序放在任何目录均可运行。这是一个小巧灵活的FTP服务器工具, 占用系统资源少,可以方便网友间传输文件交流,建议不要开匿名系统盘根目录FTP。可快速建立小型的FTP服务器 ,可以方便应用局域网内用户互相传送文件,不用再为如何另外安装FTP服务器上浪费脑筋。 主要应用: 1、建立简单FTP服务器 2、用于局域网,互相点对点传送文件 3、建立临时FTP服务器,供大家临时下载文件等

Linux网络编程项目——C语言基于TCP通信协议模拟实现FTP功能

利用C语言基于TCP通信协议模拟实现FTP功能的Linux网络编程项目,探讨了如何设计和构建一个网络服务器,以便在Linux环境下高效地管理数据传输和文件共享。

2301_80350206的博客 2098

嵌入式linux使用的ftp服务器源码

嵌入式linux使用的ftp服务器源码

Windows 24H2升级后eNSP AR_40报错40?VirtualBox虚拟化修复指南

虚拟化技术通过Hypervisor在操作系统与硬件间建立抽象层,使虚拟机能够共享物理资源。其核心原理依赖CPU的VT-x/AMD-V指令集,而Windows 24H2对内核隔离与驱动签名的强化会直接占用或拦截这些虚拟化资源。在工程实践中,VirtualBox作为Type-2型Hypervisor,常因内存完整性开启或版本过旧导致虚拟网卡创建失败,进而引发设备启动中断。典型场景包括网络仿真实验、多系统测试环境搭建等。当eNSP的AR_40路由器依赖VirtualBox引擎时,24H2的安全策略变更便会触发错误

weixin_34375251的博客 216

Linux网络编程项目----FTP网盘

程序运行,服务端不断接收客户端指令,服务端可同时处理多个客户端接入并对指令作出解析,并把执行结果返回给客户端,客户端根据服务端对指令的解析并把由服务端传递过来的。(2)客户端匹配用户输入的指令,客户端发送指令到服务端,服务端解析指令作出响应。4、在程序运行的过程中,客户端输入lcd指令+路径 能够切换自己的目录。5、客户端输入get指令+文件名,能将服务端上面的某个文件下载到客户端。6、客户端输入put指令+文件名,能将客户端上面的某个文件上传到服务端。2、客户端输入cd指令+路径,可以切换服务端的目录。

buhuidage的博客 624

【gateway nc adapter虚拟网卡 win11 联想】问题的解决

由于需要登录公司内网,于是启用奇安信VPN。但启动后报出网关未连接的问题,于是我检查了我的网络适配器,并尝试解决,以下给出几种我实践过程中的行动,并附带最后成功的解决方法。

m0_73602417的博客 6551

FTP云盘项目

本文介绍了一个基于Linux网络编程实现的FTP服务器系统,包含服务端和客户端组件。系统采用socket通信实现文件传输功能,支持远程文件浏览(ls/lls)、目录切换(cd/lcd)、文件上传下载(put/get)等操作。文章详细阐述了客户端和服务端的搭建过程:客户端通过socket创建连接、解析指令并执行相应操作;服务端则实现端口绑定、监听请求等功能。系统通过change()和choosecmd()函数识别并执行用户指令,使用strcmp/strstr进行指令匹配,采用popen执行系统命令。该FTP服

2202_75840803的博客 996

从理论到实践:Zemax驱动下的离轴三反光学系统全流程构建

本文详细阐述了从理论推导到软件实现的离轴三反光学系统全流程设计方法。文章首先分析了离轴三反系统在空间遥感等领域的优势,然后手把手指导如何基于像差理论计算共轴三反的初始结构参数,包括曲率半径与圆锥系数。最后,重点介绍了在Zemax中完成从共轴建模、视场离轴设置到优化与性能评估的完整实战步骤,为光学工程师提供了宝贵的经验与避坑指南。

weixin_29205061的博客 238

Vivado固化程序与Flash型号添加实战指南

本文详细介绍了Vivado程序固化到Flash芯片的完整流程,包括基础操作、Flash型号添加方法及疑难问题排查。针对Vivado官方支持列表缺失的Flash型号,提供了手动添加配置的详细步骤和参数说明,并分享了高级技巧与安全操作建议,帮助开发者高效完成FPGA程序固化。

weixin_29291573的博客 566

基于Linux网络编程和文件编程实现的FTP云盘项目

socket网络编程建立服务端与客户端的连接,文件编程实现客户端与服务端数据通信,客户端通过获取用户输入的命令,进行相关的命令识别和处理,服务端通过检测客户端发送的命令,执行相应的操作,并将执行命令所获得的数据发送给客户端。get+xxx:实现客户端远程从服务器端获取文件。put+xxx:实现客户端上传文件到服务器端。lcd+xxx:实现客户端切换目录的操作。cd+xxx:实现服务器切换目录的操作。lls:实现查看客户端当前目录下文件。quit:实现客户端的退出操作。

2301_77164542的博客 161

HDMI端口辐射(EMI)超标解决方案

HDMI端口辐射(EMI)超标解决方案 一、HDMI EMC设计要求: 1、HDMI EMC设计原理图 ( 图 一 ) 2、HDMI元件选型及参数说明:(图一所示) a.L510、L511、L512、L513使用专业EMI共模滤波器(普通共模电感寄生电容太大,会导致TMDS差分阻抗匹配测试失败),阻抗值为90Ω~100Ω(两路共模滤波器型号:CMF1210DH900MFR;四路共模滤波器型号:CMF2010DH101MFR), b.U1、U2为排式ESD(ESD排型号:ESD0524PA),越低的结电容

ltqdxl的博客 1万+

C语言实现FTP服务器:简易高效的文件传输工具

C语言实现FTP服务器:简易高效的文件传输工具 去发现同类优质开源项目:https://gitcode.com/ 在软件开发领域,文件传输是基本需求之一。C语言实现FTP服务器,以其高效的性能和稳定的服务,为开发者提供了一个简洁的文件传输解决方案。本文将详细介绍这个开源项目,帮助您了解它的核心功能、技术优势和应用场景。 项目介绍 C语言实现FTP服务器,是一个基于Linux环境,使用C语言标准库和...

gitblog_06712的博客 676

华为od 面试八股文_C++_02_含答案

华为od 面试八股文_C++_02_含答案

MISAYAONE的博客 3121

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 417

C语言实现FTP服务器

C语言实现FTP服务器 去发现同类优质开源项目:https://gitcode.com/ 此仓库包含了一个使用C语言在Linux环境下实现的FTP服务器项目。该服务器支持文件的上传和下载功能。 项目介绍 本项目基于C语言标准库,利用网络编程相关API,实现了一个简易的FTP服务器。用户可以通过FTP客户端软件连接到该服务器,进行文件的传输。 功能特点 支持文件上传 支持文件下载 基于命令行操作的...

gitblog_06701的博客 327

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

FTP云盘

项目简介 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行,服务端不断接收客户端指令,服务端可同时处理多个客户端接入并对指令作出解析,并把执行结果返回给客户端,客户端根据服务端对指令的解析并把由服务端传递过来的处理信息通过客户端呈现给客户,实现文件的各种操作。 功能说明 本文是基于Linux网络编程实现的FTP服务器,服务器由

zhuguanlin121的博客 4951

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LINUX学习-用C语言实现FTP项目

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,...

weixin_44263604的博客 3503
上一篇: Linux 网络编程
下一篇: 全志H616学习笔记
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值