qt5集成libcurl实现tftp和ftp的方法一:搭建环境

最近使用QT5做一个软件,要求实现tftp和ftp文件传输,使用QT5开发好UI界面等功能,突然发现QT5不直接提供tftp和ftp支持,无奈之下只好找第三方库来间接实现,根据网友的介绍,libcurl是一个比较小巧好用的网络扩展库,但问题来了,该怎么用呢?折腾了几天,终于在周五晚上别人都下班回家了,我还不甘心的情况下加班找到了解决的方法。现在整理出来,分享给大家,也给自己做个笔记。

首先介绍如何搭建使用环境,这个非常重要,下一篇介绍如何实现文件传输。这涉及到qt5、minGW和libcurl编译三方面的协同。

1.安装QT5的注意事项

安装qt5说起来非常简单,但是经常出错,有时候是装上之后运行QT creator的时候出现错误。下面介绍一个我测试过没有问题的安装方法:

首先是qt5建议安装qt5.5.0等公认的稳定性比较好的版本,不要随便找个版本就安装。推荐一个下载地址http://mirror.bit.edu.cn/qtproject/archive/qt/5.5/5.5.0/

打开这个地址,看一看到里面有很多版本,三大系统win、Linux和mac都有,win环境又分了msvc、mingw和x86与x64等多种版本,这个必须要注意。qt本身不能编译程序的,要借用VisualStudio或者gcc来完成编译。前者对应的版本就是名称中带有msvc的版本,而后者就是能够在win下运行的GCC开发工具链。如果你电脑里装了可用的VisualStudio环境,可以使用msvc版的,但是为了减少不必要的麻烦,我强烈建议只选择MinGW版本的。我选择的版本是qt-opensource-windows-x86-mingw492-5.5.0.exe  ,注意mingw版本的只有32位的。

注意在有些版本中,比如在qt5.0的安装文件中有名称中带opengl的,这种版本是在qt中集成了OpenGL,安装这种版本需要安装显卡驱动之类的,特别容易出错,强烈建议不安装。

下载后直接安装即可,还有一个需要注意的是,在安装时有下面这个个选项,在Tools下有个MinGW,强烈建议安装,后面有用。

2.编译libcurl

在编译libcurl时,可以使用其lib下的makefile文件直接编译,但是必须先配置好MinGW,这里必须保证编译器与QT5使用的一致。我首先在网上下载了一个MinGW,但是编译成功的无法使用,报告“file not recognized: File format not recognized”错误。那么最好的编译器是什么呢?就是上面说的QT安装时Tools下的MinGW。

先将其添加到环境变量中,然后调用Make编译即可。

配置环境变量的参数是,如果你不知道,请百度一下,方法和配置java等都一样的:

新建 MINGW_HOME 值为C:\Qt\Qt5.5.1\Tools\mingw492_32 (你的安装路径)

path变量添加“;%MINGW_HOME%\bin;”

假如你的文件在D:\workspace\curl-7.32.0下,那么cd过去,然后使用下面的命令编译即可:

mingw32-make -f Makefile.m32

然后等待编译完成。 编译完成之后,我们可以在curl的lib目录下看到几个文件:libcurl.a、libcurl.dll和libcurldll.a三个文件,这就是我们需要的链接库了。

3.使用

接下来我们要在qt5中添加libcurl库,并将一个html网页保存到本地,以此检测curl是否正确工作。

新建一个QT5工程,类型可以是widget,也可以是Dialog类型,这个没关系,工程名为libcurl_download_html,然后将curl下的include文件夹复制到当前工程目录下。

接下来,在当前工程的debug目录下新建一个lib文件夹,将编译好的libcurl.a、libcurl.dll和libcurldll.a三个文件放进来。

这里需要注意了,qt5默认是将编译的路径放在和libcurl_download_html同级的地方,而不是像VS一样放在其下面,嘛意思呢?请先看我的目录:下面的红框是我指定的工程目录,而其编译好的文件是在上面红框的,两者在同一级目录下。

这其实不太方面的,我们希望能像VisualC一样将debug目录放在工程下面,方法是单击左侧的“项目”,然后修改图中所示的路径即可。

完成之后,将libcurl.dll放到qt的安装目录的bin目录下,例如我的qt安装路径是C:\Qt\Qt5.5.1\5.5\mingw492_32\bin,所以我将dll文件放到这里来。测试发现,如果不进行这个操作,会有可以编译但不能运行的问题。

最后一个配置。打开libcurl_download_html.pro文件,在TEMPLATE = app下添加一行代码:
LIBS+="./../lib/libcurl.dll"

4.测试

修改mainwidow.cpp文件,其完整代码为:

[cpp] view plain copy

print?

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <errno.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <sys/stat.h>
  8. #include<QDebug>
  9. #include"./include/curl/curl.h"
  10. size_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p) {
  11. FILE *fp = (FILE *)user_p;
  12. size_t return_size = fwrite(buffer, size, nmemb, fp);
  13. qDebug()<< (char *)buffer << endl;
  14. return return_size;
  15. }
  16. int curlTest2()
  17. {
  18. // 初始化libcurl
  19. CURLcode return_code;
  20. return_code = curl_global_init(CURL_GLOBAL_ALL);
  21. if (CURLE_OK != return_code)    {
  22. qDebug() << "init libcurl failed." << endl;
  23. return -1;
  24. }
  25. // 获取easy handle
  26. CURL *easy_handle = curl_easy_init();
  27. if (NULL == easy_handle)
  28. {
  29. qDebug()  << "get a easy handle failed." << endl;
  30. curl_global_cleanup();
  31. return -1;
  32. }
  33. FILE *fp = fopen("d:/data.html", "ab+");
  34. // 设置easy handle属性
  35. curl_easy_setopt(easy_handle, CURLOPT_URL, "http://c.biancheng.net/cpp/html/314.html");
  36. curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);
  37. curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);
  38. // 执行数据请求
  39. curl_easy_perform(easy_handle);
  40. // 释放资源
  41. fclose(fp);
  42. curl_easy_cleanup(easy_handle);
  43. curl_global_cleanup();
  44. }
  45. MainWindow::MainWindow(QWidget *parent) :
  46. QMainWindow(parent),
  47. ui(new Ui::MainWindow)
  48. {
  49. int a=curlTest2();
  50. ui->setupUi(this);
  51. }
  52. MainWindow::~MainWindow()
  53. {
  54. delete ui;
  55. }

编译运行,就可以看到我们这篇博客被qt5自动下载到本地了,在控制台输出下载的html文件,并且在D盘下生成一个data.html的文件。不过由于设置不完整,中文都是乱码,这个先不管了,以后再介绍怎么操作。

示例程序下载地址:http://download.csdn.net/detail/xueyushenzhou/9554355

http://blog.csdn.net/xueyushenzhou/article/details/51702672

时间: 2024-08-23 15:44:10

qt5集成libcurl实现tftp和ftp的方法一:搭建环境的相关文章

qt5集成libcurl实现tftp和ftp的方法之二:实现tftp文件上传和下载

QT5本身对ftp和tftp的支持不太好,找了很多地方也没找到好用的方法,无奈之下只好使用开源的curl来实现.但是该怎么使用tftp一直没找到说明.在curl的doc下有一堆的examples,但是就是没有tftp的,但是文档里明明说实现了tftp啊?答案是人家感觉tftp太简单了,都懒得单独写个demo了,╮(╯▽╰)╭深深的被鄙视了.下面我就说一下该怎么使用tftp功能. 1.建立tftp测试环境 写代码过程中随时会出问题,一旦环境出了问题,一切都是白搭,所以首先建立tftp的测试环境,方

linux网络安装(PXE + DHCP+TFTP+ Kickstart+ FTP)

需要使用到的服务:PXE + DHCP+TFTP+ Kickstart+ FTP 运行原理如下图: 原理和概念:  1.前言        首先,简单谈谈为什么要采用无人值守网络安装linux操作系统.一方面是运维管理的需要,因各种需要,安装操作系统在实验室内时有发生,有时候更出现批量安装某一型号操作系统的情形,这时候如果用光盘挨个安装将变得异常繁琐,并且需要人工值守.此外,因操作系统种类较多(主要是针对linux),内部人员使用频繁,也会带来管理上的问题.另一方面是当前MPX项目开发的需要,为

RHEL7无人值守 DHCP+TFTP +SYSLINUX+FTP +KICKSTART

RHEL7无人值守 DHCP+TFTP +SYSLINUX+FTP +KICKSTART本人的linux学习笔记 二.实验步骤 服务器配置 客户端配置 三.配置过程 服务器配置 1.最小化安装 2.配置yum源 3.安装图形化界面 4.配置IP地址 5.安装 无人值守 需要的服务:DHCP+TFTP +SYSLINUX+FTP +KICKSTART 安装DHCP 安装TFTP 安装SYSLINUX 安装FTP 安装kickstart 6.    关闭防火墙,查看服务状态 四.测试 一.实验环境

CentOS7 无人值守服务环境搭建(PXE + DHCP+TFTP+ Kickstart+ FTP)

一,搭建无人值守服务器安装软件(PXE + DHCP+TFTP+ Kickstart+ FTP)IP:192.168.2.10 系统版本:CentOS Linux release 7.4.1708 (Core)  二,配置本地yum源,安装所需软件: [[email protected] yum.repos.d]# mount /dev/cdrom /mnt/mount: /dev/sr0 写保护,将以只读方式挂载[[email protected] yum.repos.d]# vim serv

NFS、FTP、SAMBA服务搭建

一.NFS配置 NFS服务:即是共享存储,如有A.B.C三台服务器,那么文件存放在A上,B.C可通过NFS服务即可访问A共享的文件. 1.服务端安装过程 yum install -y nfs-utils vim /etc/exports 写入以下内容: /proc/ 14.120.0.0/24(rw,sync,all_squash,anonuid=501,anongid=501) ##rw:表示可读可写,若为ro表示只读 ##sync表示同步模式,内存中数据无时无刻写入磁盘:若为async表示非

exportfs命令 NFS客户端问题 FTP介绍 使用vsftpd搭建ftp

一.exportfs命令NFS服务端的nfs服务不能随意重启,如果需要重启服务端的nfs服务,需要先把挂载服务端共享目录的所有客户端的挂载先全部卸载客户端执行:#umount /mnt/ //提示如下umount.nfs4: /mnt: device is busy解决:第一种办法:退出/mnt目录[[email protected] mnt]# cd[[email protected] ~]# umount /mnt/第二种方法:#umount -l /mnt/ 先卸载掉客户端的挂载,然后在重

华为设备,通过tftp和ftp上传下载文件

真机IP192.168.10.10/24 R1 G0/0/0 IP192.168.10.1/24 在真机上搭建tftp服务器实现路由上传下载 使用tftpd32搭建TFTP服务器 R1配置 <R1>system-view                  //进入系统视图 [R1]interface GigabitEthernet 0/0/0     //进接口 [R1-GigabitEthernet0/0/0]ip address 192.168.10.1 24   // 配置接口IP [R

TFTP 与 FTP的区别

FTP(File Transfer Protocol,文件传输协议)协议在TCP/IP协议族中属于应用层协议,用于在远端服务器和本地客户端之间传输文件,使用TCP端口20和21进行传输.端口20用于传输数据,端口21用于传输控制消息.TFTP(Trivial File Transfer Protocol,简单文件传输协议)也是用于在远端服务器和本地主机之间传输文件的,相对于FTP,TFTP没有复杂的交互存取接口和认证控制,适用于客户端和服务器之间不需要复杂交互的环境. TFTP协议的运行基于UD

交换机的配置文件备份到TFTP和FTP服务器

1.构建拓扑2.配置地址Switch>Switch>enSwitch#conf tSwitch(config)#hostname 666 修改交换机名字666(config)#interface vlan 1 进入虚拟接口666(config-if)#ip address 192.168.1.1 255.255.255.0 配置管理地址666(config-if)#no shutdown 激活接口 666#copy running-config startup-config 保存当前运行文件到