Можно ли прочитать удаленный файл как поток с помощью libcurl? - PullRequest
5 голосов
/ 11 июня 2010

Я хотел бы использовать библиотеку libcurl, чтобы открыть удаленный файл дат и перебрать его с помощью istream.Я просмотрел хороший пример в этом потоке , но он записывает удаленный файл в локальный файл.Вместо этого я хотел бы, чтобы удаленные чтения были отправлены в поток для последующих программных манипуляций.Это возможно?Я был бы очень признателен за помощь.

Best, Аарон

1 Ответ

2 голосов
/ 11 июня 2010

Поток ввода-вывода Boost может быть лучшим решением, чем собственный поток STL. По крайней мере, создать поток поддержки намного проще. Из собственных документов 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;
}

Примечание: когда я запускаю приведенный выше код, я получаю segfault в CURL, это происходит потому, что я не знаю точно, как использовать сам curl.

...