Как загружаются файлы с серверов на языках программирования, таких как C? Я понимаю, что языки более высокого уровня имеют магические функции, такие как «download_file_from_url()», но они не помогают мне понять, что происходит на самом деле. Я немного знаком с сокетами, но сетевое программирование в целом по-прежнему является черным ящиком для меня. Спасибо за любую помощь.Как программно загружать файлы из Интернета?
ответ
В основном, на низком иш уровне, программа открывает сокет к порту 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
. Также есть «перемещенные временные» ответы, и т.д., и т.д.)
Ваши данные неверны. если указан HTTP/1.1, сервер должен поддерживать соединение в живом состоянии, если только «соединение: закрыть» не передается в качестве заголовка. – KillianDS
@KillianDS: Спасибо! Исправлена. –
Вы должны проверить libcurl
- это с открытым исходным кодом, чтобы вы могли его прорвать и посмотреть, как уважаемая библиотека подходит к этой проблеме.
Используйте библиотеку, как libcurl.
И «черный ящик», вероятно, хороший способ держать его :-)
Вы делаете то же самое в C, что вы могли бы сделать на «высокоуровневых языках» - использовать библиотечную функцию, которая делает это для тебя. (Разница в том, что библиотечная функция не является стандартной встроенной частью языка).
Один выбор для C является libcurl
При загрузке файла с использованием HTTP, то вы должны прочитать RFC on HTTP (как данные разделить на куски и т.д.), используя FTP - RFC on FTP (команды, которые используются, например, PWD
, CD
и т.д.). Однако это протоколы более высокого уровня, которые в любом случае используют сокеты.
Чтобы скачать файл (предположим, что у этого простого случая нет брандмауэра и т. Д.)), Вам нужно:
Подключение к серверу DNS, чтобы разрешить имя сервера URL-адреса в IP
Открыть подключение к этому IP на порт или порт по умолчанию URL для вашего протокола (80 для HTTP)
Отправить соответствующую команду HTTP к этому серверу
Listen для ответа HTTP
реакция процесса правильно, и если ответ содержит данные для файла, keepr Eding réponse и сохранение данных в временный файл
Когда файл полностью загружен, закрыть соединение и переместить весь временный файл в надлежащее место нахождения.
хотя мне нравится детальность/специфичность вашего ответа - зачем включать пулю # 1, поскольку она автоматическая на почти любой мыслимой системе, где это можно было бы разработать? Заметим также, что вы дали версию размером 35 000 футов, что совсем не связано с запросом OP. – KevinDTimm
- 1. GAE blobstore - программно загружать файлы
- 2. Загружать файлы js из Интернета или обслуживать их самостоятельно?
- 3. Загрузить файлы из Интернета
- 4. Как загружать файлы программно из Google Storage через python?
- 5. Программно скопировать файлы из «Временных файлов Интернета» в другой каталог
- 6. Как автоматически загружать файлы из Internet explorer
- 7. Программно загружать встроенные SWF-файлы с сайтов?
- 8. Загрузить файлы (PDF) из Интернета
- 9. Невозможно программно загружать файлы из пакета в UITextView и UIImageView
- 10. Программно загружать файл из расширения chrome. Как?
- 11. Как загружать изображения из папки mipmap программно?
- 12. Асинхронно загружать изображение из Интернета/базы данных в Android ListView
- 13. Как загружать изображения из Интернета для песен на SD-карте?
- 14. Как разрешить пользователям загружать zip-файлы из Интернета с помощью php?
- 15. Как сделать Perl загружать файлы из Интернета в текущем каталоге на Ubuntu?
- 16. загружать сериализованные файлы из django
- 17. Автоматически загружать файлы из папки
- 18. Как загружать файлы Postgres
- 19. Как безопасно загружать файлы
- 20. Как загружать файлы HDFS?
- 21. Как пропустить недостающие файлы при загрузке нескольких файлов из Интернета?
- 22. Как правильно загружать файлы и автоматически загружать файлы
- 23. Prestashop: загружать CSV программно
- 24. Как программно загружать приложения Android из Google Play?
- 25. Виртуальные файлы открываются из временных файлов Интернета
- 26. Программа не будет загружать файлы из Интернета при работе в системе
- 27. Как загружать распространенные файлы данных?
- 28. Как отображать изображение из Интернета?
- 29. Как безопасно загружать файлы конфигурации на iPad?
- 30. Загружать различные конечные точки из конфигурации программно
Возможно, вам будет удобно называть 'wget' или любую другую внешнюю программу для загрузки файла? –
http://curl.haxx.se/libcurl/c/ – Amarghosh
или посмотрите исходный код этих двух, если вы не можете использовать их как черные ящики. –