Загрузите файл из Интернета на C ++ без использования нестандартных библиотек в Linux - PullRequest
6 голосов
/ 04 ноября 2010

Когда я говорю о нестандартных библиотеках, я имею в виду такие вещи, как Boost, libCurl и все остальное, что может сделать это гораздо проще, чем стандартный C ++.Причина в том, что я пишу приложение как часть курсовой работы (класс посвящен C ++), и мне необходимо использовать только стандартные библиотеки и функции.

Я ищу, чтобы загрузить файл RSSиспользуя URL-адрес, который предоставит пользователь (я создаю элементарный RSS-клиент), и самая большая проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как получить файл.Как только я пройду этот бит, его разбор по тегам xml и отображение контента будет относительно простым.Я искал вокруг, и я нашел только решения, которые говорят, чтобы использовать нестандартные библиотеки, обычно libCurl.Если бы кто-то мог просто дать мне быстрое представление о том, на что я должен обращать внимание, то я был бы благодарен.

Кроме того, если вы думаете, что помогаете мне обмануть, то нет.Задача состоит в том, чтобы создать приложение по нашему выбору, и мы оцениваем использование различных функций языка (он должен содержать так много классов, использовать эти типы переменных и т. Д.).

Ответы [ 6 ]

9 голосов
/ 04 ноября 2010

Во-первых, это невозможно сделать, используя только стандартный C ++. Нет сетевого интерфейса ни в стандартном C ++, ни в стандартном C.

Если вам нужно использовать подход «сделай сам», то, вероятно, вы собираетесь использовать API сокетов вашей платформы. В случае с Linux это часть стандарта POSIX, а не C ++, и доступна из <sys/socket.h>.

Основная процедура: анализ URL; искать IP-адрес домена; создать сокет; подключить розетку; записать HTTP-запрос в сокет; читать ответ HTTP обратно из сокета; убирать.

Очевидно, что HTTP-библиотека гораздо удобнее, тем более что загрузка HTTP может оказаться более сложной, чем я описываю выше (например, если сервер отвечает перенаправлением). Практически во всех дистрибутивах Linux предусмотрены программы libcurl и / или curl и wget.

9 голосов
/ 04 ноября 2010

Проверьте Руководство Биджа по сетевому программированию для быстрого, но отличного знакомства с сокетами. Если вы не можете использовать какие-либо нестандартные библиотеки, вы можете вручную подключиться к порту 80 и сделать запрос самостоятельно.

Предполагая даже знание C ++ на начальном уровне, это все, что вам нужно.

3 голосов
/ 04 ноября 2010

Написание программы для подключения к сокету относительно тривиально.

http://www.linuxhowtos.org/C_C++/socket.htm

Теперь, когда у вас есть сокет, открытый для HTTP-сервера, вам нужнопонять, как запросить документ и как расшифровать ответ:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

В основном вам необходимо отправить:

GET<SP><URL><SP>HTTP/1.1<CRLF>

Where:
  SP:    Single Space
  CRLF:  \r\n
  URL:   The Full URL of the page including the server name.

То, что вы получите, будет

http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6

HTTP/1.1<SP>200<SP>OK<CRLF>
(<Header><CRLF>)*
<CRLF>
<Document>

Вышеуказанное означает:

  • Первая строка - строка ответаэто должно содержать 200 ОК.
    • Если этого не происходит, возникает какая-то ошибка, и вам следует просто сдаться.
  • Далее следуют 0 или более строк заголовка
    • Просто игнорируйте эти строки
  • Там будет 1 пустая строка, чтобы отметить конец заголовков.
  • Тогда документ будет в потоке.
2 голосов
/ 04 ноября 2010

Если вы действительно хотите сделать это без использования libcurl, вы всегда можете открыть tcp-сокет и затем отправить:

GET /myurl 

(http 1.0 или предпочтительно используйте http 1.1 )

По сути, вы пишете очень простую реализацию клиента протокола HTTP.

0 голосов
/ 04 ноября 2010

Поскольку вам не разрешено использовать нестандартные библиотеки, вы можете написать свой собственный класс-оболочку для команды linux "curl" (я предполагаю, что вы используете linux). Curl - очень мощная команда, и она, вероятно, может делать то, что вам нужно.

0 голосов
/ 04 ноября 2010

Вы можете скачать исходный код для wget стандартной утилиты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...