curl WRITEFUNCTION и классы - PullRequest
9 голосов
/ 19 ноября 2010
class Filter{
private:
    string contents;
    bool Server(void);
public:
    void handle(void *, size_t, size_t, void *);
   };

У меня есть такой заголовок класса.я хочу вызвать curl WRITEFUNCTION внутри функции Server, которая будет использовать handle для записи содержимого строки.хотя он продолжает давать мне ошибку

error: invalid use of member (did you forget the ‘&’ ?)

строка, на которую указывает ошибка, является строкой CURLOPT_WRITEFUNCTION .... Мой запрос curl выглядит примерно так ...

curl_easy_setopt(curl,CURLOPT_URL, address.c_str());
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle);
curl_easy_perform(curl);

, что означаетневозможно получить доступ к дескриптору () .. как я могу исправить это?

Ответы [ 3 ]

17 голосов
/ 19 ноября 2010

дескриптор должен быть статической функцией-членом. Вы можете передать указатель на экземпляр Filter в качестве последнего аргумента с помощью CURLOPT_WRITEDATA

class Filter
{ 
private:
    std::string content_;
    static size_t handle(char * data, size_t size, size_t nmemb, void * p);
    size_t handle_impl(char * data, size_t size, size_t nmemb);
};

size_t Filter::handle(char * data, size_t size, size_t nmemb, void * p)
{
    return static_cast<Filter*>(p)->handle_impl(data, size, nmemb);
}

size_t Filter::handle_impl(char* data, size_t size, size_t nmemb)
{
    content_.append(data, size * nmemb);
    return size * nmemb;
}

int main()
{
   // curl initialization... should be done in a constructor
   Filter f;
   curl_easy_setopt(curl, CURLOPT_WRITEDATA, &f);
   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Filter::handle);
   // curl cleanup... should be done in a destructor
   return 0;
}
3 голосов
/ 19 ноября 2010
string temp;

curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&temp);

size_t Filter::handle(void *ptr, size_t size, size_t nmemb, string stream)
{
    string temp(static_cast<const char*>(ptr), size * nmemb);
    stream = temp;
    return size*nmemb;
}

вот как я заставил его работать .. это сохранит сайт в строку с именем temp.

1 голос
/ 24 июня 2012

Я использую curlpp :

std::stringstream result;

request.setOpt(cURLpp::Options::WriteStream(&result));
request.perform();

, это сохранит веб-сервер ответа в потоке строк с именем result.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...