2010-05-06 3 views
3

Как загружаются файлы с серверов на языках программирования, таких как C? Я понимаю, что языки более высокого уровня имеют магические функции, такие как «download_file_from_url()», но они не помогают мне понять, что происходит на самом деле. Я немного знаком с сокетами, но сетевое программирование в целом по-прежнему является черным ящиком для меня. Спасибо за любую помощь.Как программно загружать файлы из Интернета?

+3

Возможно, вам будет удобно называть 'wget' или любую другую внешнюю программу для загрузки файла? –

+0

http://curl.haxx.se/libcurl/c/ – Amarghosh

+0

или посмотрите исходный код этих двух, если вы не можете использовать их как черные ящики. –

ответ

12

В основном, на низком иш уровне, программа открывает сокет к порту 80 (обычно) на сервере и отправить ему запрос, который выглядит примерно так:

GET /index.html HTTP/1.1 
Host: stackoverflow.com 

... а затем пустая строка.

Затем сервер отвечает данными, которые обычно состоят из нескольких строк заголовка, пустой строки и запрошенного ресурса. С HTTP 1.1 по умолчанию поддерживается сохранение соединения для последующих запросов (хотя сервер может прекратить его, если он понравится); если бы я использовал HTTP 1.0 или добавил заголовок Connection: close, то сервер отправил бы сообщение после отправки ресурса.

За подробной информацией обращайтесь к Wikipedia article on HTTP, или, если вы действительно хотите войти в него, ознакомьтесь с the spec (все-в-одной-странице here). Вы можете видеть, как это выглядит для вас, если у вас есть telnet (и, вероятно, вы это делаете). Просто введите telnet stackoverflow.com 80, а затем введите строки выше. Не забудьте нажать Enter на пустой строке.

Вы не хотите изобретать это колесо. Практически во всех языках и средах есть библиотека, которая поможет вам справиться со всеми сложностями. (Например, попробуйте приведенный выше пример с www.stackoverflow.com вместо stackoverflow.com в обоих местах:   — вы возвращаете ответ «навсегда», потому что команда SO хочет, чтобы SO находилось в stackoverflow.com, а не www.stackoverflow.com. Также есть «перемещенные временные» ответы, и т.д., и т.д.)

+1

Ваши данные неверны. если указан HTTP/1.1, сервер должен поддерживать соединение в живом состоянии, если только «соединение: закрыть» не передается в качестве заголовка. – KillianDS

+0

@KillianDS: Спасибо! Исправлена. –

9

Вы должны проверить libcurl - это с открытым исходным кодом, чтобы вы могли его прорвать и посмотреть, как уважаемая библиотека подходит к этой проблеме.

4

И «черный ящик», вероятно, хороший способ держать его :-)

Вы делаете то же самое в C, что вы могли бы сделать на «высокоуровневых языках» - использовать библиотечную функцию, которая делает это для тебя. (Разница в том, что библиотечная функция не является стандартной встроенной частью языка).

Один выбор для C является libcurl

1

При загрузке файла с использованием HTTP, то вы должны прочитать RFC on HTTP (как данные разделить на куски и т.д.), используя FTP - RFC on FTP (команды, которые используются, например, PWD, CD и т.д.). Однако это протоколы более высокого уровня, которые в любом случае используют сокеты.

1

Чтобы скачать файл (предположим, что у этого простого случая нет брандмауэра и т. Д.)), Вам нужно:

  • Подключение к серверу DNS, чтобы разрешить имя сервера URL-адреса в IP

  • Открыть подключение к этому IP на порт или порт по умолчанию URL для вашего протокола (80 для HTTP)

  • Отправить соответствующую команду HTTP к этому серверу

  • Listen для ответа HTTP

  • реакция процесса правильно, и если ответ содержит данные для файла, keepr Eding réponse и сохранение данных в временный файл

  • Когда файл полностью загружен, закрыть соединение и переместить весь временный файл в надлежащее место нахождения.

+1

хотя мне нравится детальность/специфичность вашего ответа - зачем включать пулю # 1, поскольку она автоматическая на почти любой мыслимой системе, где это можно было бы разработать? Заметим также, что вы дали версию размером 35 000 футов, что совсем не связано с запросом OP. – KevinDTimm

Смежные вопросы