Как программно загрузить файлы из Интернета? - PullRequest
3 голосов
/ 06 мая 2010

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

Ответы [ 6 ]

12 голосов
/ 06 мая 2010

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

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

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

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

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

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

9 голосов
/ 06 мая 2010

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

4 голосов
/ 06 мая 2010

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

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

Один выбор для C: libcurl

1 голос
/ 06 мая 2010

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

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

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

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

  • Прослушать HTTP-ответ

  • Правильно обработайте ответ, и если ответ содержит данные для файла, сохраните ответ и сохраните данные во временном файле

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

1 голос
/ 06 мая 2010

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

0 голосов
/ 06 мая 2010

Используйте библиотеку вроде libcurl .

...