• 基于HTTP协议下载文件的实现


    最近在开发文件下载的程序,该程序是基于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协议的文件下载,服务器是如何把数据发到客户端的。

  • 相关阅读:
    如何提高送测版本的质量(开发篇)?
    web安全测试资料
    如何带领新人
    华为新人180天详细培养计划
    畠山芳雄:新员工培训的十三条黄金法则
    BUG级别定义标准
    EF-Linq将查询结果转换为List<string>
    在差距中进步,在记录中进步,
    Error: [ng:areq] Argument 'xxxx' is not a function, got undefined
    Book-编程珠玑-第一章
  • 原文地址:https://www.cnblogs.com/howardhuo/p/4390672.html
Copyright © 2020-2023  润新知