Высокоуровневая клиентская библиотека HTTP для собственного C/C++ в Win32

Это вызывается, когда существует файл класса, от которого зависит Ваш код, и это присутствует во время компиляции, но не найдено во времени выполнения. Ищите различия в свое время изготовления и пути к классам во время выполнения.

11
задан Piotr Dobrogost 14 July 2009 в 08:42
поделиться

7 ответов

Win32 предоставляет функции Internet * .

http://msdn.microsoft.com/en-us/library/aa385473 (VS.85) .aspx

Вам необходимо выполнить (IIRC, я не касался этих API-интерфейсов более 10 лет) InternetOpenURL и InternetReadFile .

8
ответ дан 3 December 2019 в 03:19
поделиться

Я думаю libcurl соответствует этим требованиям. И еще кое-что.

В этом примере показано, как получить страницу HTTP, сохранив ее только в памяти. Это немного больше кода, чем в вашем примере, но он на C.

7
ответ дан 3 December 2019 в 03:19
поделиться

POCO также имеет кроссплатформенные сетевые компоненты.

В примерах программа FTP представлена ​​примерно в таком виде (без проверки ошибок)

Poco::Net::FTPStreamFactory::registerFactory();
std::ofstream localFile(inputFile, std::ios_base::out | std::ios_base::binary);
Poco::URI uri(inputURL);
std::auto_ptr<std::istream> ptrFtpStream(Poco::Net::URIStreamOpener::defaultOpener().open(uri));
Poco::StreamCopier::copyStream(*ptrFtpStream.get(), localFile);
4
ответ дан 3 December 2019 в 03:19
поделиться

Вы не ищете неправильные места. Это просто печальная реальность. Вот почему существует оболочка C ++ для libcurl под названием curlpp .

Ниже приведен пример того, как получить веб-страницу и распечатать ее в потоке stdout.

#include <curlpp/curlpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>


using namespace curlpp::options;

int main(int, char **)
{
  try
  {
    // That's all that is needed to do cleanup of used resources (RAII style).
    curlpp::Cleanup myCleanup;

    // Our request to be sent.
    curlpp::Easy myRequest;

    // Set the URL.
    myRequest.setOpt<Url>("http://example.com");

    // Send request and get a result.
    // By default the result goes to standard output.
    myRequest.perform();
  }

  catch(curlpp::RuntimeError & e)
  {
    std::cout << e.what() << std::endl;
  }

  catch(curlpp::LogicError & e)
  {
    std::cout << e.what() << std::endl;
  }

  return 0;
}
1
ответ дан 3 December 2019 в 03:19
поделиться

Часть библиотеки Qt, QtNetwork, также возможна.

1
ответ дан 3 December 2019 в 03:19
поделиться

Помимо libcurl / curlpp (который является гибким и мощным, но я считаю его очень ... неуклюжим), есть две библиотеки C ++, за которыми я слежу. Оба они довольно новые и основаны на Boost :: ASIO. Однако ни один не поддерживает прокси (насколько я могу судить).

cpp-netlib ( blog ), возможно, более зрелый (я знаю, что он прошел некоторое тестирование в реальном мире ), но на данный момент не хватает таймаутов (я над этим работаю!). Пример:

network::http::request  request("http://google.com");
network::http::client   client;
network::http::response response;

response = client.get(request);
if (response.status() == 200)
{
    std::cout << body(response));
}

Urdl ( документация ) написан создателем ASIO и имеет таймауты (но было объявлено только в прошлом месяце ). Он использует другую модель, предпочитая работать с потоками:

urdl::istream is("http://google.com");
std::string line;
while (std::getline(is, line))
{
    std::cout << line << std::endl;
}

Я согласен с тем, что C ++ не имеет большой поддержки HTTP, но обе эти библиотеки многообещающи.

7
ответ дан 3 December 2019 в 03:19
поделиться
0
ответ дан 3 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: