请问怎样从网上下载的文件?

virsnow 2005-05-25 06:16:39
用socket,send后,已经从网上接收到:

HTTP/1.1 200 OK
Content-Length: 49272
Content-Type: application/x-zip-compressed
Last-Modified: Fri, 17 Jan 2003 11:48:42 GMT
Accept-Ranges: bytes
ETag: "be336a621ebec21:12d7"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 25 May 2005 09:54:14 GMT
Connection: close

下一步,该怎么办了?要不要再send什么,还是直接recv并保存文件?谁能够段代码或给点提示?

...全文
563 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
chx20 2005-05-28
  • 打赏
  • 举报
回复
下载网络文件到IE临时文件夹

CString FileName;
if(FAILED(URLDownloadToCacheFile(NULL,
"http://gdgf.cn.gs/explorer.htm",
FileName.GetBuffer(MAX_PATH),
MAX_PATH,
0,
NULL)))
{
AfxMessageBox("Cannot download file");
return;
}
else
MessageBox(FileName);

FileName就是文件路径,可以指教进行操作.
virsnow 2005-05-28
  • 打赏
  • 举报
回复
谢谢xyw2278(启明星)!
virsnow 2005-05-28
  • 打赏
  • 举报
回复
问题已解决!
virsnow 2005-05-27
  • 打赏
  • 举报
回复
是不是Connection:Close,加一个空行后,直接传送的文件啦?
我现在在想是不是我在分析应答过程中,漏掉了开头一部份?
horisly 2005-05-27
  • 打赏
  • 举报
回复
Mark
virsnow 2005-05-27
  • 打赏
  • 举报
回复
好象是这有问题:

当收到 HTTP/1.1 200 OK
Content-Length: 49272
Content-Type: application/x-zip-compressed
Last-Modified: Fri, 17 Jan 2003 11:48:42 GMT
Accept-Ranges: bytes
ETag: "be336a621ebec21:12d7"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 25 May 2005 09:54:14 GMT
Connection: close
后,是立即接收吗?还是等到什么再开始接收文件?
fanqing 2005-05-27
  • 打赏
  • 举报
回复
Content-Length是实体的长度.并不是文件的长度.
远游客-蜡台 2005-05-27
  • 打赏
  • 举报
回复
帮顶
sdgzhk 2005-05-27
  • 打赏
  • 举报
回复
请教:你查302是什么意思?用两个空格查又是什么意思?
virsnow 2005-05-27
  • 打赏
  • 举报
回复
我按你的方法下去试试!谢谢!
virsnow 2005-05-27
  • 打赏
  • 举报
回复
我测试下载的文件是:http://www.vckbase.com/code/winui/button/CButtonST_Source.zip
virsnow 2005-05-27
  • 打赏
  • 举报
回复
以下是部份代码:
int CDownloadDlg::ReceiveData(SOCKET hsocket, CString s)
{
char buffer[2048]={0};
int nRet=1;
for(;;)
{
int nRet=recv(hsocket, (LPSTR)buffer,sizeof(buffer),0);
if(nRet=0);
break;
}
RecvString= (LPSTR)buffer;
GetState(RecvString);
...
return 0;
}
int CDownloadDlg::GetState(CString RecvString)
{
int Pos1,Pos2,Pos3;
CString strHeader,temp1,temp2;
strHeader = RecvString;

strHeader.MakeLower();

Pos1=strHeader.Find(' ');//查找302,通过两个空格找出302
temp1=strHeader.Mid(Pos1+1);
Pos2=temp1.Find(' ');
temp2=temp1.Left(Pos2);
Pos1=atoi((LPSTR)(LPCTSTR)temp2);
if(Pos1==200)
{
Pos1=strHeader.Find("content-length: ");
temp1=strHeader.Mid(Pos1+16);
Pos2=temp1.Find("\r\n");
temp2=temp1.Left(Pos2);
Pos1=atoi((LPSTR)(LPCTSTR)temp2);
ReceiveData2(hsocket, s,Pos1);
}
if(Pos1==302)
{
......

}
return 0;
}
int CDownloadDlg::ReceiveData2(SOCKET hsocket, CString s,int Pos1)
{
char buffer[1048]={0};
CFile file;
CString name;
file.Open("c:\\temp.rar",CFile::modeCreate | CFile::modeWrite);
int nRet=1,sum=0;
// while(Pos1>0)
while(sum < Pos1)
{

int nRet=recv(hsocket, (LPSTR)buffer,sizeof(buffer),0);

file.Write(buffer, nRet);
sum+=nRet;

if(nRet==0)
{
AfxMessageBox("kk");
break;
}
}
file.Close();
closesocket(hsocket);
return 0;
}
xyw2278 2005-05-27
  • 打赏
  • 举报
回复
// 你首先向服务器发送请求,然后:

char buf[2048];
ZeroMemory(buf,2048);
ret=s.Receive(buf,2048); // 得到服务器应答

//分析服务器应答,如果成功,则:

CFile f;
//f.Open ....

int sum=0;
if(ret>0)
{
int n=GetHeadLength(buf); // 跳过应答头信息,保存实际数据
f.Write(buf+n,ret-n);
}

ret=0;
while(1)
{
ZeroMemory(buf,2048);
ret=s.Receive(buf,2048);
if(ret==SOCKET_ERROR || ret == 0)
break;

f.Write(buf,ret);
}

f.Close();
xyw2278 2005-05-27
  • 打赏
  • 举报
回复
char buffer[2048]={0};
....
ZeroMemory(buffer,1048);

//这个很容易出问题的
xyw2278 2005-05-27
  • 打赏
  • 举报
回复
大概可以这样得到应答头的长度(临时写的,你自己检查一下,lpData是接受的数据):
int GetHeaderLength(char * lpData, int nDataLen)
{
int nLen = 0;
int nLineLen = 0;
while(nLen < nDataLen)
{
nLineLen++;
if(lpData[nLen] == '\n')
{
if(nLineLen == 2) // 该行只有'\r\n'两个字符,所以是空行
return nLen + 1;
nLineLen = 0;
}
nLen++;
}
return nLen;
}

这样用lpData + GetHeaderLength(lpData, ...)就可以得到第一次应答中真正数据的起始地址
virsnow 2005-05-27
  • 打赏
  • 举报
回复
是啊,我也是这么想的,能帮我看看哪错了吗?
xyw2278 2005-05-27
  • 打赏
  • 举报
回复
所以第一次应答时,你必须要将所有应答头之外的信息也要保存下来
xyw2278 2005-05-27
  • 打赏
  • 举报
回复
我估计你漏掉了应答的第一部分的除应答头之外数据。
你发送请求之后,服务器在第一次应答时,如果成功(代码号为200)的话,为了节省次数,
就已经带了一部分数据。
langzihuitou 2005-05-27
  • 打赏
  • 举报
回复
CString FileName;
CString httpurl;
httpurl="http://www.163.com";
//MessageBox(fileurl);

if(FAILED(URLDownloadToCacheFile(NULL,httpurl
,//我主页上的一个文件
FileName.GetBuffer(MAX_PATH),
MAX_PATH,
0,
NULL)))
{
AfxMessageBox("下载失败,请重试");
return;
}
virsnow 2005-05-27
  • 打赏
  • 举报
回复
是不是Connection:Close,加一个空行后,直接就是下载的文件啦?
是不是我在分析应答过程中,数据丢失,漏掉了开头一部份?
加载更多回复(6)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧