2010-11-19 16 views
8
class Filter{ 
private: 
    string contents; 
    bool Server(void); 
public: 
    void handle(void *, size_t, size_t, void *); 
    }; 

मेरे पास इस तरह का क्लास हेडर है। मैं फ़ंक्शन सर्वर के अंदर कर्ल WRITEFUNCTION को कॉल करना चाहता हूं जो स्ट्रिंग सामग्री को लिखने के लिए हैंडल का उपयोग करेगा। हालांकि यह मुझे त्रुटिकर्ल WRITEFUNCTION और कक्षाएं

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

लाइन त्रुटि द्वारा बताया CURLOPT_WRITEFUNCTION की कि .... मेरे कर्ल अनुरोध कुछ इस तरह दिखता है ...

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

कि करने के लिए अपने असमर्थ मतलब है giveng रहता है हैंडल एक्सेस करें() .. मैं इसे कैसे सुधार सकता हूं?

उत्तर

2
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; 
} 

thats कैसे मैं काम करने के लिए मिल गया .. यह अस्थायी नामित स्ट्रिंग के लिए वेबसाइट की बचत होगी द्वारा पिछले तर्क के रूप में फिल्टर के कहने के लिए सूचक पारित कर सकते हैं।

+1

यह एक स्थानीय std :: स्ट्रिंग temp बनाता है जहां डेटा संग्रहीत किया जाता है। फिर temp को तर्क स्ट्रीम में कॉपी किया जाता है। जब funcdtion लौटाता है, तो दोनों स्ट्रिंग हटा दी जाएंगी। temp.append (...) इसके बजाय वैश्विक स्ट्रिंग अस्थायी डेटा को लिखने के लिए या वैश्विक स्ट्रिंग के लिए पॉइंटर के साथ सही हस्ताक्षर का उपयोग करें और इस पॉइंटर के माध्यम से कॉल करें। – hansmaad

+0

आपको एपेंड का उपयोग करना चाहिए क्योंकि लिखने के फ़ंक्शन को एक संसाधन के लिए कई बार कहा जा सकता है जिसे आप लोड कर रहे हैं – hansmaad

+0

जो मुझ पर दुर्घटनाग्रस्त है – Tim

16

हैंडल एक स्थिर सदस्य कार्य होना चाहिए। आप 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; 
} 
का उपयोग कर
+0

कोई उदाहरण बनाने से कोई अन्य तरीका है? –

+1

यदि आप std :: string फ़िल्टर :: सामग्री पर लिखना चाहते हैं, तो आपको एक उदाहरण की आवश्यकता है। यदि आप वैश्विक सामग्री बफर को लिखना चाहते हैं, तो आप केवल स्थिर हैंडल विधि या एक निःशुल्क हैंडल फ़ंक्शन का उपयोग कर सकते हैं। – hansmaad

+1

+1, यह जाने का रास्ता है। @ प्रसाद माधवन, यदि आपने कोई उदाहरण नहीं बनाया है तो 'फ़िल्टर'' लिखने के लिए 'संभाल' होगा? –

1

मैं curlpp उपयोग कर रहा हूँ:

std::stringstream result; 

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

इस stringstream नामित परिणाम के जवाब वेबसर्वर बचत होगी।