如何通过编程从网上下载文件?

3

在像C这样的编程语言中,文件如何从服务器下载?我知道高级语言有像“download_file_from_url()”这样的神奇函数,但它们并没有帮助我理解实际发生了什么。我对套接字有点熟悉,但网络编程总体上仍然是一个黑匣子。感谢任何帮助。


3
дҪ жҲ–и®ёеҸҜд»ҘдҪҝз”ЁwgetжҲ–е…¶д»–еӨ–йғЁзЁӢеәҸдёӢиҪҪиҝҷдёӘж–Ү件пјҢиҝҷж ·еҒҡжІЎй—®йўҳеҗ—пјҹ - Grzegorz Oledzki
http://curl.haxx.se/libcurl/c/ - Amarghosh
如果您无法将它们用作黑盒,请查看这两个的源代码。 - Pascal Cuoq
6个回答

13
基本上,在较低层次上,程序正在打开到服务器端口80(通常)的套接字,并向其发送类似于以下请求的内容:

Basically, at a low-ish level, the program is opening a socket to port 80 (usually) on the server and sending it a request that looks something like this:


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。还有“暂时移动”响应等等。)


1
您的细节有误。如果指定了HTTP/1.1,则服务器应该保持连接处于活动状态,除非作为标头传递了“connection: close”。 - KillianDS

9
你应该查看 libcurl - 它是开源的,所以你可以深入挖掘它,并了解一个受人尊重的库如何处理这个问题。

4

一个“黑盒子”可能是保护它的好方法 :-)

在C语言中,您需要使用库函数来完成与“高级语言”相同的任务-这一点并没有什么不同(区别在于库函数不是语言的标准内置部分)。

C语言的选择之一是libcurl


1

如果您正在使用HTTP下载文件,则应阅读 HTTP RFC(如何通过块拆分数据等),使用FTP - FTP RFC(使用哪些命令,例如PWDCD等)。但是这些都是利用套接字的高级协议。


1

要下载文件(假设没有防火墙等简单情况),您需要执行以下操作:

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

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

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

  • 监听 HTTP 响应

  • 正确处理响应,如果响应包含文件数据,则继续读取响应并将数据保存在临时文件中

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


1
虽然我喜欢你回答的详细性,但为什么要包括第一点呢?因为在几乎所有可能开发的系统中,这是自动的。请注意,你给出的是35,000英尺高空的版本,与OP的问题完全不相关。 - KevinDTimm

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接