Помогите с потоковой передачей через http в C++

Я хочу использовать веб-сервис, который предлагает потоковое API. Этот API обычно может использоваться java-методом java.net.URL.openStream();

Проблема в том, что я пытаюсь разработать свою программу на C++ и понятия не имею, какие библиотеки (я слышал, что библиотека cUrl очень хороша в таких вещах) использовать или как их использовать, чтобы делать то, что я хочу.

Идея состоит в том, что после открытия файла в виде потока я могу получить доступ к постоянно обновляемым данным в реальном времени.

Любая помощь приветствуется.


person Travis    schedule 11.02.2010    source источник


Ответы (2)


Boost.Asio сокеты iostreams кажутся тем, что вы после. Ваш код будет выглядеть так:

ip::tcp::iostream stream("www.someserver.com", "http");
if (!stream)
{
  // Can't connect.
}

// Use stream as a regular C++ input stream:
std::string text;
std::getline(stream, text);

Если вы новичок в C++ и не имеете опыта работы с iostreams, тогда эта страница станет отличным подспорьем. источник информации. В частности, проверьте документацию класса istream, чтобы узнать, какие операции поддерживает ваш поток Boost.ASIO. Вы обнаружите, что они не так уж сильно отличаются от API Java IO.

РЕДАКТИРОВАТЬ:

Eric is right, you'll have to send some requests to the server (using the same stream) so it's probably less similar to Java's openStream than I thought. The following example shows how to make those requests:

http://blog.think-async.com/2007_01_01_archive.html

person Manuel    schedule 11.02.2010
comment
Чтобы ваш пример работал, я думаю, вам нужно написать запрос GET в потоке, прежде чем читать его. Что-то вроде: stream << "GET /index.html HTTP/1.0\r\n\r\n"; - person Éric Malenfant; 11.02.2010
comment
Спасибо, Эрик, я пропустил это. - person Manuel; 11.02.2010

Это зависит от того, что вам нужно. предложение Мануэля о boost::asio::ip:: tcp::iostream хорош, если вы хотите что-то на более низком уровне, напрямую возвращая «сырой» ответ сервера (однако я подозреваю, что в примере, приведенном в его ответе, чего-то не хватает: я думаю, что запрос «GET» должен быть записывается в поток перед чтением из него. См. этот пример из документации Asio).

У меня нет опыта работы с java.net.URL.openStream(), но кажется, что он находится на более высоком уровне, поскольку возвращает только тело (а не заголовки) ответа, заботится о перенаправлениях HTTP и т. д. В этом случае, да, libcurl может быть больше, чем вы хотите. Вы также можете взглянуть на библиотеку cpp-netlib, которая создана поверх Boost.Asio. Он все еще находится в зачаточном состоянии, но его http://cpp-netlib.github.com/html/c___network_library/protocol/http/http_client_example.html, кажется, уже предоставляет что-то очень похожее на то, что предоставляется Java URL.openStream()

person Éric Malenfant    schedule 11.02.2010