最近在开发文件下载的程序,该程序是基于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. ODBC与JDBC比較

    在学习J2EE的JDBC过程中,刚见到JDBC就立即联想到了ODBC,并且我们能够肯定他们之间有必定的关系.開始学它的时候还是认为有点晕,于是就查了非常多资料,与比較熟悉的ODBC进行了比較. 先各自 ...

  2. 【Android】自带Theme

    [Android]自带Theme android之uses-permission   在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...

  3. Java 可中断线程

    PART.1 无法中断的线程 一个无法中断的线程的例子. public class UninterruptableThread { @SuppressWarnings("deprecatio ...

  4. 一个C/C++结构体初始化有趣的现象

    我们知道C语言当中结构可以使用{}进行初始化,例如有结构体定义如下: typedef struct type_t { int a; int b; int c; int d; }type_t; 我们可以 ...

  5. Sizzle一步步实现所有功能(层级选择)

    第二步:实现Sizzle("el,el,el..."),Sizzle("el > el"),Sizzle("el el"),Sizzl ...

  6. i = i++ 在java字节码层面的分析

    有这么一段代码: package zl.test; public class PcodeTest { /** * @param args */ public static void main(Stri ...

  7. 监控concurrent 正在执行的sql

    SELECT a.sid, a.serial#, b.sql_text   FROM v$session a, v$sqltext b WHERE a.sql_address = b.address  ...

  8. Mongodb基础知识----Mongodb权威指南阅读

    文档是Mongodb中数据的基本单元,类型关系型数据库中的行,每个文档都有一个键值唯一的键_id.集合可以看做拥有动态模式的表. Mongodb一个实例可以拥有多个相互独立的数据库. Mongodb区 ...

  9. jQuery中的.live()与die()

    翻译原文地址:http://www.alfajango.com/blog/exploring-jquery-live-and-die/ 很多开发者都知道jQuery的.live()方法,他们大部分知道 ...

  10. Android 内存管理之优化建议

    OOM(OutOfMemory)转:http://hukai.me/android-performance-oom/ 前面我们提到过使用getMemoryClass()的方法可以得到Dalvik He ...