最近在开发文件下载的程序,该程序是基于HTTP开发的。
首先是了解了文件传输到客户端的大概格式,然后分析该格式,实现写入文件的功能.
自己构造的HTTP包如下:
GET /*********.rar HTTP/1.1
host:www.****.com
connection:keep-alive
这个请求成功发出去了,而服务器的回应也是成功的,HTTP/1.1 200..................
可惜的是,我的循环接收不争气,本来800KB左右的文件,只能接收到70KB左右,只是什么原因呢?
------------------------------------------------------------------------------------------------------------
通过多次的尝试,终于找到原因了。不过这个原因的原因还不清楚,让我说说这个原因吧。
构造这个请求是正确的,不过最好将connection的值改为close,不然程序会等待连接失效。
本来我的程序是这样接收数据的。
while(1) { recvSize=recv(mySock,dataBuf,1000,0); file.write(dataBuf,recvSize); memset(dataBuf,0,1000); if(recvSize<1000) { break; } }
我本来认为数据接收到最后的时候,且必须是最后的时候,数据块才会减少。但实践证明,数据接收的中途,会出现数据块没填满的情况,其中原因有待研究。
现在,我将接收的循环改为recvSize<=0就break,程序便正确的接收完整了。
while(1) { recvSize=recv(mySock,dataBuf,1000,0); if(recvSize<=0) { break; } file.write(dataBuf,recvSize); memset(dataBuf,0,1000); }
用recvSize<1000的那个循环不行的原因,估计是因为网络上的问题。因为网络可能会出现延迟,或者是网络不好的情况,使接收的数据不一定能把缓存塞满。
-------------------------------------------------------------------------------------------------------------------------------------------------
在这里,再说一下基于http协议的文件下载,服务器是如何把数据发到客户端的。