【问题标题】:How to obtain raw data from curl in C++ [duplicate]如何从 C++ 中的 curl 获取原始数据 [重复]
【发布时间】:2019-11-11 08:58:27
【问题描述】:

我正在使用 curl 库 (https://curl.haxx.se/download.html),我想从某个 pastebin (raw) 链接中读取原始文本,然后将该原始数据存储在名为“密码”的字符串中",但它不起作用。它仅获取数据“test12345”(来自下面代码中的链接)并出于某种原因将其打印出来,但不允许我将其存储在“密码”变量中。

我认为我做错了什么,但我不确定。

Here是问题截图:

它在没有 std::cout 的情况下输出原始数据,但不将其存储在“密码”变量中。我真的很困惑

这是我的代码:

#define CURL_STATICLIB
#include <curl/curl.h>
#include <iostream>
#include <string>

using std::string;

int main()
{
    CURL *curl = curl_easy_init();

    string password;

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://pastebin.com/raw/95W9vsvR");

        curl_easy_setopt(curl, CURLOPT_READDATA, &password);

        curl_easy_perform(curl);
    }

    /*std::cout << password;*/
}

【问题讨论】:

  • @πάνταῥεῖ 发生这种情况:prntscr.com/o8jq2q
  • @evil 您的代码甚至不接近链接中建议的内容。您需要使用CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA。如果您花时间环顾 curl 站点,这一切都有很好的记录。
  • @πάνταῥεῖ NOT 重复。如何将结果放入 C 语言中的 C 字符串与如何将结果放入 c++ 语言中的 std::string 非常不同。您提出的重复问题是如何将其放入 C 字符串中,这家伙(邪恶)想知道如何将其放入 std::string 中。
  • @hanshenrik 不过,将 c 字符串放入 std::string 很容易。我不认为这是 OP 的主要问题。

标签: c++ curl


【解决方案1】:

正如 super 所说,也许您应该更详细地阅读 CURL 文档。在您的情况下,您不能依赖默认回调函数,因为该默认函数会将 userdata 指针解释为 FILE* 指针。

所以你需要提供你自己的回调函数,它应该将网络数据附加到你的 C++ 字符串对象中。

下面的代码似乎可以满足您的要求:

#include  <curl/curl.h>
#include  <iostream>
#include  <string>


size_t  write_callback(const char* ptr, size_t size, size_t nc, std::string* stp)
{
    if (size != 1) {
        std::cerr << "write_callback() : unexpected size value: " <<
                     size << std::endl;
    }

    size_t  initialLength = stp->length();
    size_t    finalLength = initialLength;

    stp->append(ptr, nc);    // REAL WORK DONE HERE
    finalLength = stp->length();

    // must return the actual gain:
    return (finalLength - initialLength);
}


size_t  write_callback_shim(char* ptr, size_t size, size_t nmemb, void *userdata)
{
    // just a place for the cast

    size_t        rc  = 0;
    std::string*  stp = reinterpret_cast<std::string*>(userdata);

    rc = write_callback(ptr, size, nmemb, stp);
    return rc;
}


int  main(int argc, const char* argv[])
{
    CURL*  curl = curl_easy_init();

    std::string password;

    if (curl == nullptr) {
        std::cerr << "curl pointer is null." << std::endl;
    }
    else {
        curl_easy_setopt(curl, CURLOPT_URL, "https://pastebin.com/raw/95W9vsvR");
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &password);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_shim);

        curl_easy_perform(curl);
    }

    std::cout << "Password set to: " << password  << std::endl;
}

【讨论】:

  • {((std::string*)userdata)-&gt;append(ptr,size*nmemb);return size*nmemb; }
  • @hanshenrik 是的。但是 CURLOPT_WRITEFUNCTION 的在线文档提到大小始终为 1。请参阅 curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html
  • 嗯,默认函数是 fwrite,size*nmemb 是 fwrite 的作用。不要认为 Stenberg 会改变大小,既因为没有必要,又因为假设大小始终为 1,它会破坏程序,所以我认为这两种方法都有有效的论据(我的论点是 @987654325 @ 而你的论点是Stenberg said the size is always 1 ~)
猜你喜欢
  • 2012-05-11
  • 2021-01-09
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多