【问题标题】:libcurl explodes at write_data() functionlibcurl 在 write_data() 函数处爆炸
【发布时间】:2014-11-12 20:22:10
【问题描述】:

如果 curl 查询满足验证要求,我正在尝试将其内容写入文件。 我的代码编译没有错误,但在执行时我收到以下错误 ->

cryptsy # ./foundGetPrice2.o|wgetpaste
foundGetPrice2.o: rapidjson/include/rapidjson/document.h:911: rapidjson::GenericValue<Encoding, Allocator>::MemberIterator rapidjson::GenericValue<Encoding, Allocator>::FindMember(const rapidjson::GenericValue<Encoding, SourceAllocator>&) [with SourceAllocator = rapidjson::MemoryPoolAllocator<>; Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>; rapidjson::GenericValue<Encoding, Allocator>::MemberIterator = rapidjson::GenericMemberIterator<false, rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<> >]: Assertion `IsObject()' failed.
Your paste can be seen here: https://bpaste.net/show/768ea25c86d5

在我的代码的第 42 行,您可能会注意到 curl 的 2 行写入已被注释掉。如果我从那里 write_data(),它可以工作,但没有验证,所以它对我没有好处。

#include "rapidjson/include/rapidjson/document.h"
#include "rapidjson/include/rapidjson/rapidjson.h"
#include "rapidjson/include/rapidjson/writer.h"
#include <cstdio>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <curl/curl.h>
#include <unistd.h>
using namespace rapidjson;
struct myData
{
        std::fstream *file;
        std::string *str;
};
size_t write_data(void *ptr, size_t size, size_t nmemb, myData *data)
{
        size_t numBytes = size * nmemb;
        if (data->file)
                data->file->write((char*)ptr, numBytes);
        if (data->str)
                *data->str += std::string((char*)ptr, numBytes);
        return numBytes;
}
std::string tradeData;
int getData()
{
        int count = 0;
        //begin non terminating loop
        while(true)
        {
                count++;
                CURL *curl = curl_easy_init();
                if (curl)
                {
                        curl_easy_setopt(curl, CURLOPT_URL, "http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=155");
                        std::fstream file("myfile.txt", std::ios_base::out | std::ios_base::ate);
                        std::string json;
                        myData data;
                        data.file = &file;
                        data.str = &json;
                        //curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
                        //curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_data);
                        CURLcode res = curl_easy_perform(curl);
                        if (res != CURLE_OK)
                        {
                                std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
                        }
                        else
                        {
                                file << std::endl;
                                Document document;
                                document.Parse(json.c_str());
                                std::string tradeUpdate = document["return"]["markets"]["DRK"]["lasttradeprice"].GetString();
                                if (tradeUpdate > tradeData){
                                        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
                                        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_data);
                                        std::cout << std::endl;
                                }
                                else{
                                        std::cout << "There was an error! " << tradeData << std::endl;
                                }
                        }

                        /* always cleanup */
                        curl_easy_cleanup(curl);
                }
                usleep(10000000);
        }
        return 0;
}
//Le Main
int main(void)
{
        getData();
}

gdb 输出:

bpaste of gdb bt output

如何在验证后从 libcURL 请求中正确写入数据?

【问题讨论】:

    标签: c++ curl get libcurl


    【解决方案1】:

    程序因rapidjson 中的断言而崩溃:

    std::string tradeUpdate = document["return"]["markets"]["DRK"]["lasttradeprice"].GetString();
    

    实际上,在第 42 行和第 43 行注释时,您从未将任何内容分配给 std::string json,因此它保持为空,因此 document 也是空的。

    【讨论】:

    • 可以自己在bpaste中看到输出,-> {"success":1,"return":{"markets":{"DRK":{"marketid":"155", "label":"DRK\/BTC","lasttradeprice":"0.00622490", 有效。
    • 我可以将数据填充到“document.Parse(json.c_str());”如果我按照 cmets 在 if{}else{} 之前执行 WRITEDATA 就好了
    • @brad 再次,json 是一个空字符串(如果第 42 和 43 行被注释)
    • 可能是这样,但我认为那是因为我需要 FileReadStream 并将 curl 保存为 FILE fp?我认为 rapidjson 正在打破它
    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多