📄 geohttpdown.cpp
字号:
//格式化http
CString host,Ref;
host = GetHostName(the->m_DownInfo->strLocationUrl.GetBuffer(1),strObject.GetBuffer(1));
the->m_DownInfo->strLocationUrl.ReleaseBuffer();
Ref = getRefererName(the->m_DownInfo->strLocationUrl.GetBuffer(1));
pRequestHeader = HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)host,
(LPTSTR)(LPCTSTR)curl,nLength,NULL,(LPTSTR)(LPCTSTR)Ref,
the->m_DownInfo->lFromeByte,the->m_DownInfo->lToByte,
0,NULL);
// }
CGeoHttpDown::t.out(pRequestHeader);
HttpSocket.Socket();
if(is_proxy)
HttpSocket.Connect((LPTSTR)(LPCTSTR)Proxy->ProxyAddr ,Proxy->port);
else
HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer,nPort);
HttpSocket.SendRequest();
HttpSocket.SetTimeout(500,0);
pResponseHeader=HttpSocket.GetResponseCharPoint();
CGeoHttpDown::t.out(pResponseHeader);
int nLineSize = 0;
char szLine[256];
LPTestSrvLog LPlog = NULL;
while(nLineSize != -1)
{
static long num =1;
nLineSize = HttpSocket.GetResponseLine(szLine,256);
if(nLineSize > -1)
{
szLine[nLineSize] = '\0';
CString log = szLine;
LPlog = new TestSrvLog;
LPlog->Num = num;
LPlog->log = log;
::SendMessage(pFrm->m_Logworkspace.m_hWnd,WM_SETTESTSERVER,0,(LPARAM)LPlog);
}
num++;
}
int nSvrState = HttpSocket.GetServerState();
the->m_DownInfo->nSvrState=nSvrState;
CString csState;
csState.Format("%d",nSvrState);
csState=csState.Left(1);
if(csState=="3")
{
//重新定位下载网址,退出,在测试新网子
char szValue[30];
HttpSocket.GetField("Location",szValue,30);
the->m_DownInfo->strLocationUrl.Format("%s",szValue);
AfxParseURL((LPCTSTR)(the->m_DownInfo->strLocationUrl),dwServiceType,strServer,strObject,nPort);
if(strServer.IsEmpty())
{
CString strLocation;
strLocation="http://";
strLocation+=the->m_DownInfo->stSocketType.strServer;
strLocation+=the->m_DownInfo->strLocationUrl;
the->m_DownInfo->strLocationUrl=strLocation;
first = TRUE;
}
}
else if(csState=="5")
{
}
else if(csState=="2")
{
//成功连接服务器,线程结束
char szLength[30];
HttpSocket.GetField("Content-Length",szLength,30);
long nFileSize = atol(szLength);
the->m_DownInfo->lFileLength=nFileSize;
SetEvent(CGeoHttpDown::m_handle);
}
HttpSocket.CloseSocket();
AfxEndThread(0,TRUE);
return 0;
}
UINT HttpDown(LPVOID lParam)
{
LPDOWN_INFO DownInfo=(LPDOWN_INFO)lParam;
CWnd *pMainFrame=(CWnd*)DownInfo->pMainFrame;
CMainFrame* pFrm = NULL;
if(pMainFrame->IsKindOf(RUNTIME_CLASS(CMainFrame)))
{
pFrm = (CMainFrame*)pMainFrame;
}
//判断是否是代理下载
LPProxyInfo Proxy = pFrm->m_default_proxy;
bool is_proxy = false;
if(Proxy!=NULL)
is_proxy = true; //使用代理下载
//下在缓存
UINT m_CacheSize = CSetupRegister::Instance()->m_cache;
CGeoHttpDown *pHttpDL=(CGeoHttpDown*)DownInfo->the;
pHttpDL->m_stHttpDlInfo.lFileLength = DownInfo->lFileLength;//文件长度
CString strServer,strObject;
DWORD dwServiceType;
DWORD dwStartTime,dwEndTime,dwTime;
BOOL bIsStartTime=FALSE;
const char *pRequestHeader = NULL;
char *pResponseHeader=NULL;
char *pAcceptType=NULL;
unsigned short nPort;
int nTimeout= 500;
long nLength;
long lRevLength=0;
long lSizeLength=1024;
int nSocketLinkNum=1;
//开始的字节数
long nCompletedSize = DownInfo->lBreakPointByte;
//结束的字节数
long nFileSize=DownInfo->lToByte;
long CompleOffset=nCompletedSize;
int nBreakRev=DownInfo->nBreakRev;
//下在文件路局
CString strFileName=DownInfo->strFilePath;
LPCTSTR strLocatea=(LPCTSTR)DownInfo->strLocationUrl;
CString sRegPath=DownInfo->strRegSubPath;
int nPID=DownInfo->nPID;
int nCID=DownInfo->nCID;
long length = DownInfo->lFileLength;
CFile DownloadFile;
double fSpeed;
CString SCID;
SCID.Format("%d",nCID);
CString BREAK = "BREAKPOINT" + SCID;
if(!DownloadFile.Open((LPCTSTR)strFileName,CFile::modeWrite|CFile::shareDenyNone))
{
return -1;
}
if(nCID==0)
{
pHttpDL->m_stHttpDlInfo.BreakInfo0.nCID=DownInfo->nCID;
pHttpDL->m_stHttpDlInfo.BreakInfo0.lFromeByte=nCompletedSize;
pHttpDL->m_stHttpDlInfo.BreakInfo0.lToByte=nFileSize;
//开始位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT0",nCompletedSize);
//结束位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH0",nFileSize);
}
else if(nCID==1)
{
pHttpDL->m_stHttpDlInfo.BreakInfo1.nCID=DownInfo->nCID;
pHttpDL->m_stHttpDlInfo.BreakInfo1.lFromeByte=nCompletedSize;
pHttpDL->m_stHttpDlInfo.BreakInfo1.lToByte=nFileSize;
//开始位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT1",nCompletedSize);
//结束位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH1",nFileSize);
}
else if(nCID==2)
{
pHttpDL->m_stHttpDlInfo.BreakInfo2.nCID=DownInfo->nCID;
pHttpDL->m_stHttpDlInfo.BreakInfo2.lFromeByte=nCompletedSize;
pHttpDL->m_stHttpDlInfo.BreakInfo2.lToByte=nFileSize;
//开始位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT2",nCompletedSize);
//结束位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH2",nFileSize);
}
else if(nCID==3)
{
pHttpDL->m_stHttpDlInfo.BreakInfo3.nCID=DownInfo->nCID;
pHttpDL->m_stHttpDlInfo.BreakInfo3.lFromeByte=nCompletedSize;
pHttpDL->m_stHttpDlInfo.BreakInfo3.lToByte=nFileSize;
//开始位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT3",nCompletedSize);
//结束位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH3",nFileSize);
}
else if(nCID==4)
{
pHttpDL->m_stHttpDlInfo.BreakInfo4.nCID=DownInfo->nCID;
pHttpDL->m_stHttpDlInfo.BreakInfo4.lFromeByte=nCompletedSize;
pHttpDL->m_stHttpDlInfo.BreakInfo4.lToByte=nFileSize;
//开始位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("BREAKPOINT4",nCompletedSize);
//结束位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt("LENGTH4",nFileSize);
}
while(nCompletedSize < nFileSize)
{
nSocketLinkNum++;
AfxParseURL(strLocatea,dwServiceType,strServer,strObject,nPort); //分解网址
//http://www.xxx.xxx/xx/xxx/x.zip
//strServer=www.xxx.xxx,strObject=/xx/xxx/x.zip,nPort=端口
CHttpSocket HttpSocket;
//开始格式化Socket头
CString host,Ref;
host = GetHostName(DownInfo->strLocationUrl.GetBuffer(1),strObject.GetBuffer(1));
DownInfo->strLocationUrl.ReleaseBuffer();
Ref = getRefererName(DownInfo->strLocationUrl.GetBuffer(1));
pRequestHeader = HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)host,
(LPTSTR)(LPCTSTR)DownInfo->strLocationUrl,nLength,NULL,
(LPTSTR)(LPCTSTR)Ref,nCompletedSize,nFileSize,
0,NULL);
HttpSocket.CloseSocket(); //关闭Socket,防止以前打开过
HttpSocket.Socket(); //初始化Socket
//连接代理
if(is_proxy)
HttpSocket.Connect((LPTSTR)(LPCTSTR)Proxy->ProxyAddr,Proxy->port); //代理连接
else
HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer,nPort); //直接连接
HttpSocket.SendRequest(); //向服务器发送请求信息
HttpSocket.SetTimeout(nTimeout,0); //设置连接超时
pResponseHeader=HttpSocket.GetResponseCharPoint(); //返回服务器的回应信息
CGeoHttpDown::t.out(pResponseHeader);
int nSvrState = HttpSocket.GetServerState(); //获得服务器的状态值
DownInfo->nSvrState=nSvrState;
CString csState;
csState.Format("%d",nSvrState);
csState=csState.Left(1);
if(csState=="2")
{
//连接成功,向列表控件发送服务器回应信息
int nLineSize = 0;
char szLine[256];
LPTestSrvLog LPLog = NULL;
CString log;
while(nLineSize != -1)
{
nLineSize = HttpSocket.GetResponseLine(szLine,256);
if(nLineSize > -1)
{
szLine[nLineSize] = '\0';
LPLog = new TestSrvLog;
LPLog->Num = DownInfo->nCID;
log = szLine;
LPLog->log = log;
::SendMessage(pFrm->m_Logworkspace.m_hWnd,WM_SETTHREADLOG,0,(LPARAM)LPLog);
}
}
}
//用于存放接收数据的字符数组
char pData[1024];
//实际接收数据的长度(服务器返回来的值)
long nReceSize = 0;
DownloadFile.Seek(DownInfo->lBreakPointByte,CFile::begin); //设置文件指针位置
if(!bIsStartTime)
{
dwStartTime = GetTickCount(); //1:用于下载速率
bIsStartTime=TRUE; //2:用于下载速率
}
while(nCompletedSize < nFileSize)
{
WaitForSingleObject(pHttpDL->m_stHttpDlInfo.m_HandleStop,INFINITE);
//判断还剩余多少字节没有下栽
if(nFileSize-nCompletedSize<1024)
{
char* pData = new char[nFileSize-nCompletedSize];
nReceSize = HttpSocket.Receive(pData,nFileSize-nCompletedSize);
dwEndTime = GetTickCount(); //3:用于下载速率
if(nReceSize<=0)
{
HttpSocket.CloseSocket(); //没有可以接收的数据,关闭Socket
break; //return while(TRUE) !!!
}
DownloadFile.Write(pData,nReceSize); //如果接收成功,开始向文件当前位置写入数据
nCompletedSize += nReceSize; //累计已经下载的数据(用于判断是否等于要下载文件的长度,如果等于证明下载结束)
lRevLength+=nReceSize; //4:用于下载速率
DownInfo->lBreakPointByte=nCompletedSize; //!!!保存此子线程已经下载的字节数(用于下次下载的开始位置)
//5:用于下载速率
dwTime=dwEndTime-dwStartTime;
if(dwTime==0)
dwTime=10;
fSpeed = 0.0f;
fSpeed=(double)lRevLength;
fSpeed = fSpeed/(((double)dwTime)/1000.0f);
DownInfo->fSpeed=fSpeed;
}
else
{
nReceSize = HttpSocket.Receive(pData,1024); //!!!开始从服务器接收数据
dwEndTime = GetTickCount(); //3:用于下载速率
if(nReceSize<=0)
{
HttpSocket.CloseSocket(); //没有可以接收的数据,关闭Socket
break; //return while(TRUE) !!!
}
//将数据写入缓存
DownloadFile.Write(pData,nReceSize); //如果接收成功,开始向文件当前位置写入数据
nCompletedSize += nReceSize; //累计已经下载的数据(用于判断是否等于要下载文件的长度,如果等于证明下载结束)
lRevLength+=nReceSize; //4:用于下载速率
DownInfo->lBreakPointByte=nCompletedSize; //!!!保存此子线程已经下载的字节数(用于下次下载的开始位置)
//保存短点位置
pHttpDL->m_stHttpDlInfo.CFG->CFG_SetInt(BREAK,DownInfo->lBreakPointByte);
//实际下载字节数
//5:用于下载速率
dwTime=dwEndTime-dwStartTime;
if(dwTime==0)
dwTime=10;
fSpeed = 0.0f;
fSpeed=(double)lRevLength;
fSpeed = fSpeed/(((double)dwTime)/1000.0f);
DownInfo->fSpeed=fSpeed;
}
//6:用于下载速率,存入当前的子线程中
if(nCID==0)
{
pHttpDL->m_stHttpDlInfo.BreakInfo0.BreakLength0=DownInfo->lBreakPointByte;
pHttpDL->m_stHttpDlInfo.BreakInfo0.lSpeed0=fSpeed;
}
else if(nCID==1)
{
pHttpDL->m_stHttpDlInfo.BreakInfo1.BreakLength1=DownInfo->lBreakPointByte;
pHttpDL->m_stHttpDlInfo.BreakInfo1.lSpeed1=fSpeed;
}
else if(nCID==2)
{
pHttpDL->m_stHttpDlInfo.BreakInfo2.BreakLength2=DownInfo->lBreakPointByte;
pHttpDL->m_stHttpDlInfo.BreakInfo2.lSpeed2=fSpeed;
}
else if(nCID==3)
{
pHttpDL->m_stHttpDlInfo.BreakInfo3.BreakLength3=DownInfo->lBreakPointByte;
pHttpDL->m_stHttpDlInfo.BreakInfo3.lSpeed3=fSpeed;
}
else if(nCID==4)
{
pHttpDL->m_stHttpDlInfo.BreakInfo4.BreakLength4=DownInfo->lBreakPointByte;
pHttpDL->m_stHttpDlInfo.BreakInfo4.lSpeed4=fSpeed;
}
} //while
}
DownloadFile.Close();
LPTestSrvLog LPLog = new TestSrvLog;
LPLog->Num = DownInfo->nCID;
CString ttt;
ttt.Format("%d",DownInfo->nCID);
LPLog->log =ttt +"下载完毕";
CGeoHttpDown::t.out(LPLog->log);
::SendMessage(pFrm->m_Logworkspace.m_hWnd,WM_SETTHREADLOG,0,(LPARAM)LPLog);
DownInfo->bIsFileDown = FALSE;
return 0;
}
CString CGeoHttpDown::GetFileName(const CString& url)
{
int pos;
CString Name;
pos = url.ReverseFind('/');
Name = url.Mid(pos+1,url.GetLength());
return Name;
}
void CGeoHttpDown::BeginTimer(UINT nIDEvent)
{
SetTimer(nIDEvent,1000,NULL);
}
void CGeoHttpDown::StopTimer(UINT nIDEvent)
{
KillTimer(nIDEvent);
}
void CGeoHttpDown::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 1:
{
m_usetime.nSS=m_usetime.nSS+1;
if(m_usetime.nSS>=59)
{
m_usetime.nSS=0;
m_usetime.nMM+=1;
if(m_usetime.nMM>=59)
{
m_usetime.nMM=0;
m_usetime.nHH+=1;
}
}
//格式化
char sz[9];
CString ssz;
FormatTime(m_usetime.nHH,m_usetime.nMM,m_usetime.nSS,sz); //排列计时器格式
ssz = sz;
LPINSERTLISTlog LPLog = new INSERTLISTlog;
LPLog->m_nitem = m_DownInfo->nPID;
LPLog->nSubItem = 4;
LPLog->m_Log = ssz;
m_pView->SendMessage(WM_SETLISTLOG,0,(LPARAM)LPLog);
//保存时间
m_stHttpDlInfo.CFG->CFG_SetString("USETIME",ssz);
}
break;
case 2:
{
if(!m_DownInfo->nBreakRev)
{
//设置下载百分比和速率
long FileLength=m_DownInfo->lFileLength; //文件总长度
long BreakLength0,BreakLength1,BreakLength2,BreakLength3,BreakLength4; //5个子线程已经下载完的字节数
long nCompletedSize; //已经下载完的总字节数
//long nCompletedSize; //已经下载完的总字节数
long dwPercent,dwCompleted; //已完的百分比,已经下载完的总字节数
long mmSpeed; //每秒下载的字节数(xxkb/s)
CString sTemp;
if(FileLength>0L)
{
long LOffet=FileLength/5L;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -