首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

用http下载文件时中断,咋回事

2012-03-14 
用http下载文件时中断,怎么回事用http从网上下载文件时,总是下了一点就接收不到数据了接收函数如下:while(

用http下载文件时中断,怎么回事
用http从网上下载文件时,总是下了一点就接收不到数据了
接收函数如下:
while(TRUE)
{

          char   recvbuf[8192];
          strset(recvbuf, '\0 ');
          int   ret=recv(sockclient,recvbuf,sizeof(recvbuf),0);

          if(ret==0)
          {
              break;
          }
          else
          {
myfile < <recvbuf;   //myfile   是一个ofstream的对象,把缓冲区的数据输出到文件
          }
}

请求消息和服务器响应消息都很正常,就是数据接收一些之后就接收不到了,
请问上面那段代码有问题吗?

还有个现象,就是我把缓冲区设小一点,接收到的数据就会多一些,不知道怎么回事

[解决办法]
你的循环结束条件是Ret==0,但是Ret只有在网络错误的时候才会发生,你输出出来的结果只能是在对方服务器关闭连接的时候才会出现。

要正确接受http响应包,要先了解http相应包结构
status line ======> HTTP/1.1 200 OK\r\n
header ======> Date: Thu, 15 Mar 2007 06:07:33 GMT \r\n
... ======> Server: BWS/1.0\r\n
... ======> Content-Length:1469
\r\n
body ======> 压缩格式的2进制

要首先接受到 status line和header,然后再根据header中的Content-length接收body。


如果你不想搞得这么复杂,只想简单的测试一下。

就不要在while 循环里边接受,分配一个大缓冲区,一次send,一次recv,是一定不会出错的

[解决办法]
建议:
1,错误处理没做好
2,char recvbuf可以在while外分配,不要每次都分配
3,你的myfile < <recvbuf会不会有问题,如果接收到的数据中间有数值0(比如图象数据),会不会只保存部分数据
4,对于很多的网站不适用,很多网站的网页内容是chunked编码的
5,要考虑很多网站对于网络连接时间的限制(这个应该不在你所说的问题之内,时间应该有余,但是如果要实现完整的HTTP下载,需要考虑)
6,如果不知道问题在那里,调试嘛,断点嘛,GetLastError()嘛
[解决办法]
这两句似乎会有问题:
char recvbuf[8192]; // 里面的内容随机,不能保证有'\0'结尾,strset极有可能越界
strset(recvbuf, '\0 '); //此句执行时若越界,会破坏堆栈,既然内存被破坏,那什么都可能,可能sockclient值被0覆盖,可能myfile值被0覆盖,等等...

仅仅猜测。个人觉得网络即使不稳定也不会每次都出错,要不网络程序还怎么开发呢,应该是代码有问题。
[解决办法]
循环接收时,一次只从SOCKET缓存区读取少量数据:1-512字节

热点排行