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