Boost's IO Stream pourrait être une meilleure solution que propre flux de STL. Au moins, il est beaucoup plus simple de créer un flux boost. De propres docs Boost:
#include <curl/curl.h>
#include <boost/iostreams/stream.hpp>
class CURLDevice
{
private:
CURL* handle;
public:
typedef char char_type;
typedef boost::iostreams::source_tag category;
CURLDevice()
{
handle = curl_easy_init();
}
CURLDevice(const std::string &url)
{
handle = curl_easy_init();
open(url);
}
~CURLDevice()
{
curl_easy_cleanup(handle);
}
void open(const std::string &url)
{
curl_easy_setopt(handle, CURLOPT_URL, url.c_str());
curl_easy_setopt(handle, CURLOPT_CONNECT_ONLY, 1);
curl_easy_perform(handle);
}
std::streamsize read(char* s, std::streamsize n)
{
size_t read;
CURLcode ret = curl_easy_recv(handle, s, n, &read);
if (ret == CURLE_OK || ret == CURLE_AGAIN)
return read;
else
return -1;
}
};
typedef boost::iostreams::stream<CURLDevice> CURLStream;
int main(int argc, char **argv)
{
curl_global_init(CURL_GLOBAL_ALL);
{
CURLStream stream("http://google.com");
char buffer[256];
int sz;
do
{
sz = 256;
stream.read(buffer, sz);
sz = stream.gcount();
std::cout.write(buffer, sz);
}
while(sz > 0);
}
curl_global_cleanup();
return 0;
}
Remarque: lorsque je lance le code ci-dessus je reçois une erreur de segmentation dans CURL, cela semble être parce que je ne sais pas exactement comment utiliser se pelotonner.
Je ne sais pas à propos de libcurl, mais qu'en est-il de ASIO? –
@anybody +1 car ASIO a exactement cela (flux), mais il n'implémente pas de protocole lui-même (HTTP, FTP, etc) que curl fait. – Gianni