qt下采用libcurl实现ftp与tftp功能,提供源代码程序

news2024/11/20 8:39:27

一、FTP简介

      FTP(文件传输协议),工作在应用层,是用于在网络上进行文件传输的一套标准协议。它使用 TCP 传输,客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
      FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接,一条是数据连接,用于数据传送;另一条是控制连接,用于传送控制信息(命令和响应),这种将命令和数据分开传送的思想大大提高了 FTP 的效率,而其它客户服务器应用程序一般只有一条 TCP 连接。
      FTP的传输有两种方式:ASCII、二进制
      FTP支持两种模式:
            1) Standard (PORT方式,主动方式)
            2) Passive (PASV,被动方式)

二、TFTP简介

      TFTP是一个传输文件的简单协议,它基于UDP协议而实现,提供不复杂、开销不大的文件传输服务,默认端口号69。此协议设计的时候是进行小文件传输的,因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。

三、TFTP与FTP区别

      1.FTP 是完整、面向会话、常规用途文件传输协议。而 TFTP 用作 bones bare - 特殊目的文件传输协议。
      2.交互使用 FTP。 TFTP 允许仅单向传输的文件。
      3.FTP 提供身份验证。而TFTP 不。
      4.FTP 使用已知 TCP 端口号: 20 的数据和 21 用于连接对话框。 TFTP 用于 UDP 端口号 69 其文件传输活动。
      5.FTP 依赖于 TCP,是面向连接并提供可靠的控件。 TFTP 依赖 UDP,需要减少开销, 几乎不提供控件。

四、tftp和ftp服务器的搭建

1.ftp服务器使用WFTPD搭建

下载地址:https://download.csdn.net/download/linyibin_123/87341049

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.tftp服务器使用Tftpd32搭建

下载地址:https://download.csdn.net/download/linyibin_123/87341061

在这里插入图片描述

五、qt下使用libcurl实现tftp和ftp功能

1.界面

在这里插入图片描述

2.核心代码

tftp和ftp可以共享一份代码,只是url不一样而已。

static size_t writeFunc(void *buffer, size_t size, size_t nmemb,
                        void *stream)
{
  struct FtpFile *out = static_cast<struct FtpFile *>(stream);
  if(out && !out->stream)
  {
      errno_t err = fopen_s(&(out->stream), out->filename, "wb");
      if (err)
      {
          MY_DEBUG << "writeFunc fopen_s failed";
          return static_cast<size_t>(-1);
      }
  }
  qDebug()<<"filename:"<<out->filename;
  return fwrite(buffer, size, nmemb, out->stream);
}

size_t getContentLengthFunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
    long len = 0;
    int ret = sscanf_s(static_cast<const char*>(ptr), "Content-Length: %ld\n", &len);
    if (ret)
    {
        *(static_cast<long *>(stream)) = len;
    }
    return size * nmemb;
}

size_t discardFunc(size_t size, size_t nmemb)
{
    return size * nmemb;
}

size_t readFunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
    FILE *f = static_cast<FILE*>(stream);
    size_t n;
    if (ferror(f))
    {
        return CURL_READFUNC_ABORT;
    }
    n = fread(ptr, size, nmemb, f) * size;
    return n;
}

int CurlSdk::DownLoadFtp(const string &strUrl, const string &localfile, long nTimeout)
{

    curl_global_init(CURL_GLOBAL_DEFAULT);
    struct FtpFile ftpfile={
       localfile.c_str(), //name to store the file as if succesful
       nullptr
     };

    CURLcode res;
    CURL* pCurl = curl_easy_init();
    if(nullptr == pCurl)
    {
        return CURLE_FAILED_INIT;
    }

    curl_easy_setopt(pCurl, CURLOPT_URL, strUrl.c_str());
    curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, nTimeout);
    curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, writeFunc);
    curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, getContentLengthFunc);
    curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, &ftpfile);
    curl_easy_setopt(pCurl, CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_NOCWD);
    curl_easy_setopt(pCurl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
    curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L);

    res = curl_easy_perform(pCurl);
    curl_easy_cleanup(pCurl);

    //close the local file
    if(ftpfile.stream)
        fclose(ftpfile.stream);

    curl_global_cleanup();

    return res;
}

int CurlSdk::UploadFtp(const string& strUrl, const string& localfile, long tries, long nTimeout)
{
    CURLcode res = CURLE_GOT_NOTHING;
    CURL* pCurl = curl_easy_init();
    if(nullptr == pCurl)
    {
        return CURLE_FAILED_INIT;
    }

    FILE *pFile;
    long uploadedLen = 0;
    errno_t err = fopen_s(&pFile, localfile.c_str(), "rb");
    if (err)
    {
        MY_DEBUG << "fopen_s failed";
        return -1;
    }

    curl_easy_setopt(pCurl, CURLOPT_UPLOAD, 1L);
    curl_easy_setopt(pCurl, CURLOPT_URL, strUrl.c_str());
    curl_easy_setopt(pCurl, CURLOPT_FTP_RESPONSE_TIMEOUT, nTimeout);
    curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, getContentLengthFunc);
    curl_easy_setopt(pCurl, CURLOPT_HEADERDATA, &uploadedLen);
    curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, discardFunc);
    curl_easy_setopt(pCurl, CURLOPT_READFUNCTION, readFunc);
    curl_easy_setopt(pCurl, CURLOPT_READDATA, pFile);
    curl_easy_setopt(pCurl, CURLOPT_FTPPORT, "-");
    curl_easy_setopt(pCurl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
    curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L);

    for (int i = 0; (res != CURLE_OK) && (i < tries); i++)
    {
        if (i)
        {
            curl_easy_setopt(pCurl, CURLOPT_NOBODY, 1L);
            curl_easy_setopt(pCurl, CURLOPT_HEADER, 1L);
            res = curl_easy_perform(pCurl);
            if (res != CURLE_OK)
            {
                continue;
            }
            curl_easy_setopt(pCurl, CURLOPT_NOBODY, 0L);
            curl_easy_setopt(pCurl, CURLOPT_HEADER, 0L);
            fseek(pFile, uploadedLen, SEEK_SET);
            curl_easy_setopt(pCurl, CURLOPT_APPEND, 1L);
        }
        else
        {
            curl_easy_setopt(pCurl, CURLOPT_APPEND, 0L);
        }
        res = curl_easy_perform(pCurl);
    }
    fclose(pFile);

    qDebug() << "UploadFtp res:" << res;

    return res;
}

3.源代码程序下载(包含库封装和库调用两个工程):

下载地址:https://download.csdn.net/download/linyibin_123/87341139

六、测试结果

tftp测试结果:
在这里插入图片描述

ftp测试结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于xml的自动装配之byName

基于xml的自动装配之byName 自动装配方式&#xff1a;byName byName&#xff1a;将自动装配的属性的属性名&#xff0c;作为bean的id在IOC容器中匹配相对应的bean进行赋值总结&#xff1a;当类型匹配的 bean 有多个时&#xff0c;此时可以使用 byName 实现自动装配 配置bean &…

02:损失函数总结

目录 nn.L1Loss: nn.NLLLoss: nn.MSELoss: nn.CrossEntropyLoss: 损失函数是用来估量模型的预测值与真实值的不一致程度&#xff0c;它是一个非负实值函数。我们训练模型的过程&#xff0c;就是通过不断的迭代计算&#xff0c;使用梯度下降的优化算法&#xff0c;使得损失函…

多叉树 [数据结构与算法][Java]

多叉树 在二叉树中每个结点只能有一个数据项, 并且最多有两个子节点, 如果允许每个结点可以有更多的数据项和更多的子节点, 那么就是多叉树 多叉树: multiway tree 那么我们为什么要提出多叉树? 因为二叉树有一定的问题: 即使二叉树的操作效率高, 但是也存在问题: 二叉树需…

django之前后端不分离的操作(增删改查)

背景&#xff1a; demo采用的是前后端不分离的操作&#xff0c;用Bootstrap作为前段页面框架使用 1.先说模板之间的继承&#xff08;针对HTML来讲&#xff09; 父模板中编写好公共代码块&#xff0c;例如一个网站的导航和footer部分 在内容部分注明 {%block content%} {%e…

53 记一次自定义 classloader 导致的 metadataspace OOM

前言 这是最近 flink 集群上面暴露出现的一个问题 具体的细节原因 就是 flink 上面提交任务的时候, 自定义的 classloader 加载 driver.jar 然后导致 metaspace OOM 由于这边的 TaskManager metadataspace 配置相对较小(MaxMetaspaceSize配置为96M), 然后导致 出现了 metada…

BUUCTF Misc [SUCTF2018]single dog 我吃三明治 sqltest [SWPU2019]你有没有好好看网课?

[SUCTF2018]single dog 下载文件 使用kali的binwalk工具分析 进行文件分离 解压其中的压缩包&#xff0c;得到1.txt 看内容应该是js加密后的结果&#xff0c;复制到AAEncode在线解密网站 得到flag flag{happy double eleven} 我吃三明治 下载文件 使用010 eito…

AICodeHelper - AI编程助手

AICodeHelper是一款AI编程助手&#xff0c;旨在帮助程序员提高他们的编码技能。 简单的像尝试的代码直接问就行&#xff0c;但是一些复杂的&#xff0c;就得需要写技巧&#xff1b; 下面是几个使用的小技巧&#xff1a;链接是&#xff1a;AICodeHelper 1.可以使用中文提问&a…

深度学习Faster-RCNN网络

目录1 网络工作流程1.1 数据加载1.2 模型加载1.3 模型预测过程1.3.1 RPN获取候选区域1.3.2 FastRCNN进行目标检测2 模型结构详解2.1 backbone2.2 RPN网络2.2.1 anchors2.2.2 RPN分类2.2.3 RPN回归2.2.4 Proposal层2.4 ROIPooling2.5 目标分类与回归3 FasterRCNN的训练3.1 RPN网…

Yolov5移植树莓派实现目标检测

Hallo&#xff0c;大家好啊&#xff01;之前写了几篇Yolov5相关项目的博客&#xff0c;然后学习了树莓派之后&#xff0c;更新了几篇树莓派的博客&#xff0c;我的最终目的是将Yolov5移植到树莓派&#xff0c;通过树莓派上面的摄像头实现目标检测。你想啊&#xff0c;在工厂里面…

【word文档使用方法记录】论文格式修改

word文档使用方法记录**去掉文档都以也封面的页眉&#xff1a;****WPS公式居中&#xff0c;公式号右对齐**为论文每个章节设置不同的页眉去掉文档都以也封面的页眉&#xff1a; 将光标定位在第一页页尾&#xff0c;进入“页面布局”选项卡&#xff0c;点击“分隔符”&#xff…

【MySQL数据库入门】:数据库基础和基本操作

文章目录1. 数据库基础1.1 什么是数据库1.2 主流数据库1.3 如何配置环境1.4 链接数据库1.5服务器&#xff0c;数据库&#xff0c;表关系2.基本的数据库操作3.MySQL架构4.SQL分类5.存储引擎5.1查看存储引擎5.2 存储引擎对比6.总结1. 数据库基础 1.1 什么是数据库 存储数据用文…

安装包UI美化之路-在线安装包

在一些安装场景中&#xff0c;由于完整的安装包很大&#xff0c;下载时间长&#xff0c;且下载后需要人工干预来进行安装&#xff0c;这样会一定程度的降低用户使用体验&#xff1b;nsNiuniuSkin安装包制作解决方案提供了一种在线版本的安装包&#xff0c;支持将实际要安装的内…

C++中delete 和 delete []的真正区别

1.我们通常从教科书上看到这样的说明&#xff1a; delete 释放new分配的单个对象指针指向的内存 delete[] 释放new分配的对象数组指针指向的内存 那么&#xff0c;按照教科书的理解&#xff0c;我们看下下面的代码&#xff1a; int *a new int[10]; delete a; //方…

Java | 详解 Java连接MySQL、编写JdbcUtils工具类、使用数据库连接池、使用JavaTemplate

一、连接mysql数据库 步骤&#xff1a; 1、启动 MySQL &#xff1a;以管理员身份打开 cmd 命令行&#xff0c;输入 net start mysql 2、在 MySQL 创建一张表&#xff0c;用于后面的操作。我这里创建了一张 user 表&#xff0c;有id、name、password三个字段。 3、导入jar包 (1)…

【总结】最系统化的CV内容,有三AI所有免费与付费的计算机视觉课程汇总(2022年12月)...

欢迎大家关注有三AI的计算机视觉课程系列&#xff0c;我们的课程系列共分为5层境界&#xff0c;内容和学习路线图如下&#xff1a;第1层&#xff1a;掌握学习算法必要的预备知识&#xff0c;包括Python编程&#xff0c;深度学习基础&#xff0c;数据使用&#xff0c;框架使用等…

基于xml的自动装配之byType

基于xml的自动装配之byType 使用bean标签的autowire属性设置自动装配效果 自动装配方式&#xff1a;byType byType&#xff1a;根据要赋值的属性的类型&#xff0c;在IOC容器中匹配某个兼容类型的bean&#xff0c;为属性自动赋值 若在IOC中&#xff0c;没有任何一个兼容类型的b…

net/http 库的客户端实现(下)

前言 上一篇文章我们讲了 net/http 库客户端 request 的构建&#xff0c;接下来继续讲构建HTTP请求之后的处理操作 net/http 库的客户端实现(上) 启动事务 构建 HTTP 请求后&#xff0c;接着需要开启HTTP事务进行请求并且等待远程响应&#xff0c;以net/http.Client.Do()方法…

stm32f407VET6 系统学习 day01 GPIO 配置

1. GPIO 的5个配置 GPIO,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F407有7组IO。分别为GPIOA~GPIOG&#xff0c;每组IO有16个IO口&…

首创证券上交所上市:募资19亿市值306亿 上半年净利降14%

雷递网 雷建平 12月23日首创证券股份有限公司&#xff08;简称&#xff1a;“首创证券”&#xff0c;股票代码为&#xff1a;“601136”&#xff09;昨日在上交所上市。首创证券此次发行27,333.38万股&#xff0c;发行价为7.07元&#xff0c;募资总额为19亿元。首创证券首日收盘…

小学生C++编程基础 课程10

938.最小公倍数的简单方法 &#xff08;课程A&#xff09; 难度&#xff1a;1 登录 939.最大公约数的简单方法 ( 课程A&#xff09; 难度&#xff1a;1 登录 940.韩信点兵 &#xff08;课程A&#xff09; 难度&#xff1a;1 登录 941.求123…N的和 &#xff08;课程A&#x…