如何以编程方式从Web下载文件?

时间:2010-05-06 14:45:44

标签: c http file sockets download

如何使用C等编程语言从服务器下载文件?我理解更高级语言有魔术函数,如“download_file_from_url()”,但它们无法帮助我理解实际发生的事情。我对套接字有点熟悉,但网络编程一般对我来说仍然是一个黑盒子。谢谢你的帮助。

6 个答案:

答案 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 :(得分:9)

您应该查看libcurl - 它是开源的,这样您就可以深入了解它,看看受尊重的图书馆如何解决问题。

答案 2 :(得分:4)

“黑匣子”可能是保持它的好方法: - )

你在C语言中用“更高级语言”做同样的事情 - 使用一个为你做的库函数。 (不同之处在于库函数不是语言的标准内置部分)。

C的一个选择是libcurl

答案 3 :(得分:1)

如果您使用HTTP下载文件,则应使用FTP - RFC on HTTP(使用哪些命令,例如{{1})阅读RFC on FTP(数据如何按块分割等) },PWD等。但是,无论如何,这些都是使用套接字的更高级协议。

答案 4 :(得分:1)

要下载文件(假设一个简单的案例 - 没有防火墙等......),您需要:

  • 连接到DNS服务器以将URL服务器的名称解析为IP

  • 在URL的端口或协议的默认端口上打开与该IP的连接(对于http为80)

  • 将适当的HTTP命令发送到该服务器

  • 侦听HTTP响应

  • 正确处理响应,如果响应包含文件的数据,请保留响应并将数据保存在临时文件中

  • 完全下载文件后,关闭连接并将完整的临时文件移动到正确的位置。

答案 5 :(得分:0)

使用像libcurl这样的库。