在像C这样的编程语言中,文件如何从服务器下载?我知道高级语言有像“download_file_from_url()”这样的神奇函数,但它们并没有帮助我理解实际发生了什么。我对套接字有点熟悉,但网络编程总体上仍然是一个黑匣子。感谢任何帮助。
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
。还有“暂时移动”响应等等。)
一个“黑盒子”可能是保护它的好方法 :-)
在C语言中,您需要使用库函数来完成与“高级语言”相同的任务-这一点并没有什么不同(区别在于库函数不是语言的标准内置部分)。
C语言的选择之一是libcurl
要下载文件(假设没有防火墙等简单情况),您需要执行以下操作:
连接到 DNS 服务器以将 URL 的服务器名称解析为 IP
在 URL 的端口或协议的默认端口上打开与该 IP 的连接(http 的端口为 80)
向该服务器发送适当的 HTTP 命令
监听 HTTP 响应
正确处理响应,如果响应包含文件数据,则继续读取响应并将数据保存在临时文件中
当文件完全下载后,关闭连接并将完整的临时文件移动到正确的位置。
wget
жҲ–е…¶д»–еӨ–йғЁзЁӢеәҸдёӢиҪҪиҝҷдёӘж–Ү件пјҢиҝҷж ·еҒҡжІЎй—®йўҳеҗ—пјҹ - Grzegorz Oledzki