最近在开发文件下载的程序,该程序是基于HTTP开发的。

首先是了解了文件传输到客户端的大概格式,然后分析该格式,实现写入文件的功能.

自己构造的HTTP包如下:

GET /*********.rar HTTP/1.1\r\n
host:www.****.com\r\n
connection:keep-alive\r\n\r\n

这个请求成功发出去了,而服务器的回应也是成功的,HTTP/1.1 200..................

可惜的是,我的循环接收不争气,本来800KB左右的文件,只能接收到70KB左右,只是什么原因呢?

------------------------------------------------------------------------------------------------------------

通过多次的尝试,终于找到原因了。不过这个原因的原因还不清楚,让我说说这个原因吧。

构造这个请求是正确的,不过最好将connection的值改为close,不然程序会等待连接失效。

本来我的程序是这样接收数据的。

while()
{
recvSize=recv(mySock,dataBuf,,);
file.write(dataBuf,recvSize);
memset(dataBuf,,);
if(recvSize<)
{
break;
}
}

我本来认为数据接收到最后的时候,且必须是最后的时候,数据块才会减少。但实践证明,数据接收的中途,会出现数据块没填满的情况,其中原因有待研究。

现在,我将接收的循环改为recvSize<=0就break,程序便正确的接收完整了。

while()
{
recvSize=recv(mySock,dataBuf,,);
if(recvSize<=)
{
break;
}
file.write(dataBuf,recvSize);
memset(dataBuf,,);
}

用recvSize<1000的那个循环不行的原因,估计是因为网络上的问题。因为网络可能会出现延迟,或者是网络不好的情况,使接收的数据不一定能把缓存塞满。

-------------------------------------------------------------------------------------------------------------------------------------------------

在这里,再说一下基于http协议的文件下载,服务器是如何把数据发到客户端的。

基于HTTP协议下载文件的实现的更多相关文章

  1. 基于BT协议的文件分发系统

    基于BT协议的文件分发系统构成:    1.一个Web服务器:保存着种子文件    2.一个种子文件:保存共享文件的一些信息(文件名,文件大小    ,Tracker服务器地址,torrent为后缀) ...

  2. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  3. 基于tcp的下载文件,以及struct模块的应用。

    一 基于TCP的下载 客户端: from socket import * import os def main(): tcp_socket = socket(AF_INET, SOCK_STREAM) ...

  4. 根据http协议下载文件保存到相应的文件下

    本实例通过提供的http网址来下载文件,并保存到本地指定的文件下. 本例提供的网址为:http://112.53.80.131:8888/database/11.mdb,下载的文件名为:11.mdb ...

  5. Linux下使用http协议下载文件

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  6. http协议下载文件

    通过在 URL 上调用 openConnection 方法创建连接对象.(HttpURLConnection conn = (HttpURLConnection)new URL("网址&qu ...

  7. libcurl 通过http协议下载文件并显示下载进度

    vc6 测试工程下载地址:http://download.csdn.net/detail/mtour/8068053 代码如下: size_t my_write_func(void *ptr, siz ...

  8. 关于:基于http协议大文件断点续传上传至web服务器

    关键部分 前端用file.slice()分块 前端用FileReader获取每一分块的md5值 后端用MultipartFile接受分块文件 后端用FileOutputStream拼装分块文件 话不多 ...

  9. [php] thinkphp基于Http类 下载文件

    http://blog.csdn.net/u010081689/article/details/49360937

随机推荐

  1. jquery第四期:对象转换的小实例

    为了更清晰的看懂jquery对象是一个数组,我们这一期来改变每一个<li>中的值,在前面加上序号. 代码如下: <!DOCTYPE html PUBLIC "-//W3C/ ...

  2. jquery 自动调整图片大小

    <script type="text/javascript"> $(document).ready(function(){ $('#cons img').each(fu ...

  3. ShowDialog()弹出的窗体,关闭后,主窗体会闪烁的BUG

    如图,要实现下列等待界面时,等待界面是以ShowDialog弹出的,发现关闭后,主窗体会闪烁一下的BUG,搞半天没搞明白啥原因. 过了几天后,搜索了下发现,在fm.ShowDialog(),显示出来时 ...

  4. RabbitMQ 消息队列

    一:简介 RabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务 ...

  5. java InputStream使用

    InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len).其中read()方法是一次读取一个字节,效率 ...

  6. Asp.net MVC学习

    一.mvc项目的创建并运行 1.启动vs2010 2.新建项目 3.选择Asp.net mvc应用程序 4.不创建测试用例 5.创建之后的效果 6.运行后的mvc程序

  7. gulp+webpack+vue

    gulp+webpack+vue 章节目录 1.目标 2.实现 2.1合并库文件 2.2组织业务代码 2.3打包开发代码 2.4使用webpack-dev-server和热替换插件HotModuleR ...

  8. 使用MIDAS访问远程Access数据库

    使用MIDAS访问远程Access数据库         Allen Tao(http://blog.csdn.net/allentao/) 2005-5-3 本文源码下载 访问远程数据库常用的办法是 ...

  9. Linux下最快速共享目录的方法

    Linux下最快速共享目录的方法 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 搭建FTP,或者是搭建网络文件系统,这 ...

  10. Android之Service与IntentService的比较

    Android之Service与IntentService的比较  不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentServ ...