#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
int debugFun(CURL* curl, curl_infotype type, char* str, size_t len, void* stream)
{
//只打印CURLINFO_TEXT类型的信息
if(type == CURLINFO_TEXT)
{
fwrite(str, 1, len, (FILE*)stream);
}
}
int main(int argc, char** argv)
{
CURL* curl;
CURLcode res;
char errorBuf[CURL_ERROR_SIZE];
FILE *sendFile, *debugFile;
char ftpurl[256 + 1];
char usrpasswd[64 + 1];
curl_slist *slist=NULL;
if(argc != 7)
{
printf("Usage:\n\t./ftp ip username password ftpPath destFileName srcFile");
return -1;
}
//将相关的调试信息打印到dubugFile.txt中
if(NULL == (debugFile = fopen("debugFile.txt", "a+")))
return -1;
//打开ftp上传的源文件
if(NULL == (sendFile = fopen(argv[6], "r")))
{
fclose(debugFile);
return -1;
}
//获取需要发送文件的大小
fseek(sendFile, 0, SEEK_END);
int sendSize = ftell(sendFile);
if(sendSize < 0)
{
fclose(debugFile);
fclose(sendFile);
return -1;
}
fseek(sendFile, 0L, SEEK_SET);
if((res = curl_global_init(CURL_GLOBAL_ALL)) != 0)
{
fclose(debugFile);
fclose(sendFile);
return -1;
}
if((curl = curl_easy_init()) == NULL)
{
fclose(debugFile);
fclose(sendFile);
curl_global_cleanup();
return -1;
}
if(argv[4][strlen(argv[4]) - 1] != '/')
sprintf(ftpurl, "ftp://%s/%s/%s", argv[1], argv[4], argv[5]);
else
sprintf(ftpurl, "ftp://%s/%s%s", argv[1], argv[4], argv[5]);
curl_easy_setopt(curl, CURLOPT_URL, ftpurl);
//设置ftp上传url,组成如下的URL
//ftp://192.168.31.145//root/subdir/curl/testftp.txt
sprintf(usrpasswd, "%s:%s", argv[2], argv[3]);
curl_easy_setopt(curl, CURLOPT_USERPWD, usrpasswd);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_DEBUGDATA, debugFile);
curl_easy_setopt(curl, CURLOPT_READDATA, sendFile);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
curl_easy_setopt(curl, CURLOPT_INFILESIZE, sendSize);
curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debugFun);
res = curl_easy_perform(curl);
if(0 != res)
{
fclose(sendFile);
fclose(debugFile);
curl_easy_cleanup(curl);
curl_global_cleanup();
return -1;
}
curl_easy_cleanup(curl);
fclose(sendFile);
fclose(debugFile);
curl_global_cleanup();
return 0;
}
使用示范:
#./ftp 192.168.31.145 user passwd /root/wanghf/curl destFile srcFile
下面是debugFile.txt中的信息:
About to connect() to 192.168.31.145 port 21
Trying 192.168.31.145... connected
Connected to 192.168.31.145 (192.168.31.145) port 21
Entry path is '/root'
Connect data stream passively
disabling EPSV usage
Trying 192.168.31.145... connected
Connecting to 192.168.31.145 (192.168.31.145) port 51581
Remembering we are in dir /root/wanghf/curl/
Connection #0 to host 192.168.31.145 left intact
Closing connection #0
刚刚开始学习libcurl库,还有很多的细节不是很熟悉,这个示例很简单,也没有考虑到任何的异常,仅仅能够实现功能,能将文件上传到ftp服务器上,使用该例子,需要开启ftp服务器。
分享到:
相关推荐
本教程将聚焦于如何利用Qt库结合libcurl库来实现FTP文件的上传和下载功能。 首先,Qt是一个功能强大的C++图形用户界面库,它提供了一整套用于创建桌面和移动应用的工具和框架。而libcurl是一个开源的库,能够处理...
在本教程中,我们将探讨如何使用libcurl库在QTCreator中实现FTP和FTPS文件上传功能。 libcurl是一个开源的客户端URL传输库,支持多种网络协议,包括FTP、FTPS、HTTP、HTTPS等。这个库以其易用性和广泛的功能而受到...
**libcurl库详解** libcurl是一个强大的开源库,主要用于处理URL相关的各种网络传输任务,包括HTTP、HTTPS、FTP、FTPS等多种协议。...在实际开发中,根据具体需求灵活配置和使用libcurl,能够极大地提高工作效率。
在iOS开发中,libcurl库是一个非常重要的工具,它提供了丰富的功能来处理网络请求,如HTTP、HTTPS、FTP等协议的传输。libcurl库源于C语言编写,因此可以在多种平台上运行,包括iOS。本篇文章将深入探讨如何在iOS项目...
- 在开发过程中,cppclean是一个用于清理项目中未使用的头文件和库的工具,它可以提高编译速度并减少不必要的依赖。 - 在VS2010项目中,可能需要在构建过程的前后运行cppclean,以确保项目只包含必要的依赖。 综...
4. 编译libcurl:解压libcurl源码,配置编译选项,指示使用刚刚编译的openssl静态库。例如,在项目设置中添加openssl的头文件和库路径,同时设置链接器选项,指定使用静态链接openssl。 5. 构建:运行nmake或使用...
在Windows环境中,尤其是在Visual C++ 6.0(简称VC6.0)这样的老版本开发工具中,使用libCurl可以方便地实现网络通信功能。本教程将介绍如何在VC6.0中集成libCurl静态库,并通过示例代码展示其基本用法。 首先,你...
libcurl库由Daniel Stenberg开发,其设计目标是简化HTTP和其他网络协议的使用,包括FTP、FTPS、SMTP、POP3、IMAP和TFTP。libcurl库提供了一套统一的API(应用程序编程接口),使得开发者无需关心底层的网络细节,只...
**libcurl开发库详解** libcurl是一个开源的C语言库,它为开发者提供了一套强大的API,用于在各种协议(如HTTP、FTP、SMTP等)下传输数据。这个库广泛应用于构建网络应用程序,使得开发者可以方便地实现文件上传、...
libcurl库则是curl工具背后的引擎,提供了更高级别的接口供开发者在他们的应用程序中使用。 **FTP和FTPS** 是文件传输协议的两种形式。FTP(File Transfer Protocol)是互联网上标准的文件传输协议,允许用户从一个...
libcurl是一个开源的C语言库,它允许开发人员在各种操作系统平台上轻松地通过HTTP、HTTPS、FTP、FTPS等众多网络协议进行数据传输。libcurl库的强大之处在于它封装了底层的网络通信细节,使得开发者可以专注于应用...
**C++中的libcurl库详解** ...总之,libcurl是C++开发中处理网络请求的得力工具,其强大且灵活的功能使其成为许多项目的首选。无论你是新手还是经验丰富的开发者,libcurl都能提供你需要的网络通信功能。
libcurl库广泛应用于各种需要网络通信的场景,比如下载工具、网页抓取、文件上传、实时数据获取等。其强大的功能和跨平台特性使得它成为开发网络应用程序的首选库之一。通过"libcurl动态库及测试程序.rar",开发者...
libcurl库是开发网络应用程序的重要工具,它提供了在各种协议下传输数据的功能,包括HTTP、HTTPS、FTP、FTPS、SMTP、POP3、IMAP等。这个名为"libcurl-7.19.3-win32-ssl-msvc"的版本是针对Windows平台的,特别适用于...
总之,libcurl库是C++开发中处理网络通信的强大工具,无论是在简单的HTTP请求还是复杂的文件传输场景下,都能提供高效、灵活的解决方案。了解和掌握libcurl库的使用,对于提升C++应用程序的网络功能至关重要。通过...
在实际开发中,libCurl是一个非常实用的工具,可以大大提高网络编程的效率。但需要注意的是,由于静态库包含所有依赖,可能会导致体积较大,同时可能导致版本冲突,因此在某些场景下,动态库版本(libcurl.lib)可能...
libcurl 是一个强大的开源库,用于在各种操作系统上执行HTTP和其他网络协议...总之,libcurl是开发跨平台网络应用的强大工具,无论你是选择静态库还是动态库,了解如何正确配置和使用头文件都是成功集成libcurl的关键。
在Android开发中,libcurl库常被用来处理网络请求,如下载、上传数据或者执行复杂的HTTP操作,如OAuth认证、HTTPS连接等。libcurl.a 文件是libcurl库的静态链接库版本,适用于C和C++编程语言。 本资源提供的libcurl...
libcurl是一个开源、跨平台的URL传输库,广泛应用于各种网络编程任务,如HTTP、FTP、SMTP、POP3等多种协议的客户端开发。 【描述】:“vs2013源码编译的libcurl7.49.1动态库,包括debug和release版的dll和lib” ...
libcurl库是一个广泛使用的跨平台库,它允许开发者通过简单且统一的接口发送各种网络请求,处理数据传输,并支持各种高级功能,如SSL加密、cookies、FTP上传、HTTP POST、HTTP PUT等。 易语言版本的libcurl库允许...