为什么这不起作用?libcurl & C++
Why this is not working ? libcurl & c++
我是libcurl的新手,正在尝试使用ftp从服务器获取文件列表,通过这里的示例和其他一些帖子,我想出了以下代码。但是当我运行它时,它会返回错误消息:
写入正文失败 (4294967295 != 129)
在 CURLOPT_ERRORBUFFER 设置的错误字符串中。curl_easy_strerror( res )
返回:
将接收到的数据写入磁盘/应用程序失败
struct FtpFile
{
const char *filename;
FILE *stream;
};
static size_t fileWrite( void *buffer, size_t size, size_t nmemb, void *stream )
{
struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
{
cout << out->filename << " open failure [fileWrite] " << endl;
return -1;
}
}
size_t written = fwrite(buffer, size, nmemb, out->stream);
cout << written << endl;
if(written <= 0)
cout << "Nothing written : " << written;
return written;
}
void getFileList( const char* url, const char* fname )
{
CURL *curl;
CURLcode res;
FILE *ftpfile;
const char *errmsg;
ftpfile = fopen(fname, "wb");
if ( ftpfile == NULL )
{
cout << fname << " open failure [getFileList] " << endl ;
return;
}
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fileWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errmsg);
curl_easy_setopt(curl, CURLOPT_USERNAME, "username");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "password");
curl_easy_setopt(curl, CURLOPT_FTPLISTONLY,TRUE);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
{
fprintf( stderr, "curl_easy_perform() failed: %snError Message: %sn", curl_easy_strerror( res ), errmsg );
}
curl_easy_cleanup(curl);
}
fclose(ftpfile);
}
int main(int argc, char *argv[])
{
getFileList( "ftp://ftp.example.com/public/somefolder/", "file-list.txt" );
system("PAUSE");
return EXIT_SUCCESS;
}
4294967295 是 -1 的 32 位无符号版本,这可能是您的回调返回的内容,因此 libcurl 认为这是一个错误并停止了所有内容。
->文件名分配在哪里?
你传入一个文件 * 给CURLOPT_WRITEDATA,但你的回调把它读为结构体 FtpFile *...
首先,fileWrite
函数应返回写入的字节数。 fwrite
返回写入的对象数。所以你必须return written * size;
然后,正如丹尼尔·斯坦伯格(Daniel Stenberg)所指出的那样,您正在将FILE *
传递给fileWrite
,但将其用作struct FtpFile *
。试试这个:
static size_t fileWrite( void *buffer, size_t size, size_t nmemb, void *stream )
{
size_t written = fwrite(buffer, size, nmemb, (FILE*)stream);
std::cout << written * size << std::endl;
if(written <= 0)
std::cout << "Nothing written : " << written;
return written * size;
}
相关文章:
- 发送一个带有libcurl C++问题的帖子请求:s
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 在 libcurl 连接池中预创建连接
- libcurl 和 DNS ttl 中的内部连接管理
- 如何在 cmake 库中包含 libcurl
- 如何应用 libcurl 的持久连接选项
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 组合字符串不适用于 libCurl,C++
- Poloniex API "Invalid command" c++ libcurl
- libcurl :显示正在运行的上传和下载速率
- c++ libCurl :如何使用libCurl接受过期的证书
- libcurl :C++处理多个异步请求
- 现代C++的libcurl和JSON问题
- 使用 Libcurl 库进行文件下载
- 如何在C++生成器中使用libcurl
- Libcurl c++ "undefined reference to" (Windows/MinGW/g++)
- 如何使用 libcurl 在本地 IP 上获取 HTML?
- 如何将带有 -F 选项的 curl 命令转换为 libcurl
- 如何使用 libCurl 将访问令牌发送到服务器 API
- C++ libcurl - 无法从 URL 检索整个 html 内容