64,642
社区成员
发帖
与我相关
我的任务
分享
//读取内容
UINT nReadCount=0;
TCHAR szDownBuffer[4096];
m_pHttpFile=(CHttpFile *)m_InternetSession.OpenURL(m_pDownLoadRequest->szDownLoadUrl,1,INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_DONT_CACHE);
nReadCount=m_pHttpFile->Read(szDownBuffer,sizeof(szDownBuffer));
if (nReadCount<sizeof(szErrorHtml1)) throw 0;
if (nReadCount<sizeof(szErrorHtml2)) throw 0;
if (memcmp(szErrorHtml1,szDownBuffer,lstrlen(szErrorHtml1))==0) throw 0;
if (memcmp(szErrorHtml2,szDownBuffer,lstrlen(szErrorHtml2))==0) throw 0;
//读取大小
ASSERT(m_pHttpFile!=NULL);
BOOL bSuccess=m_pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,m_dwTotalFileSize);
if (bSuccess==FALSE) throw enDownLoadResult_InternetReadError;
//本地文件
_snprintf(m_szTempFile,sizeof(m_szTempFile),TEXT("%s\\%s.DTM"),m_pDownLoadRequest->szLocalPath,m_pDownLoadRequest->szFileName);
if (m_LocalFile.Open(m_szTempFile,CFile::modeReadWrite|CFile::modeCreate)==FALSE) throw enDownLoadResult_CreateFileFails;
//写入文件
m_LocalFile.Write(szDownBuffer,nReadCount);
//设置变量
m_ThreadLock.Lock();
m_DownLoadStatus=enDownLoadStatus_DownLoadIng;
m_dwDownLoadSize+=nReadCount;
m_ThreadLock.UnLock();
//设置变量
m_bPreparative=true;
BOOL GetFtpFile(const char* url, char** datbuf, int& bufsize, FILE** hfile, const char* user, const char* passwd, processfunc pfunc)
{
int port = 21;
char host[512];
strcpy(host, url + 6);
char* pStr = NULL;
if(pStr = strstr(host, "/"))
*pStr = 0;
int hostlen = pStr - host;
if(pStr = strstr(host, ":"))
{
*pStr = 0;
port = atoi(pStr + 1);
}
std::string sfile = url + 6 + hostlen + 1;
std::vector<std::string> paths;
SplitString(sfile, "/", paths);
if(paths.size() < 1)
return FALSE;
hostent* hostbyname = gethostbyname(host);
if (!hostbyname)
{
return FALSE;
}
int sockid = -1;
if((sockid = socket(PF_INET,SOCK_STREAM, 0)) == -1)
{
return FALSE;
}
sockaddr_in remote_addr;
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(port);
remote_addr.sin_addr = *((in_addr *)hostbyname->h_addr);
memset(&(remote_addr.sin_zero), 0, 8);
if(connect(sockid,(sockaddr*)&remote_addr, sizeof(remote_addr)) == -1)
{
closesocket(sockid);
return FALSE;
}
char buf[MAX_PATH];
std::string strret;
if (0 != GetResponseCode(sockid, 220, strret))
{
closesocket(sockid);
return FALSE;
}
std::string strsend = "USER ";
strsend = strsend + user + "\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 331, strret))
{
closesocket(sockid);
return FALSE;
}
strsend = "PASS ";
strsend = strsend + passwd + "\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 230, strret))
{
closesocket(sockid);
return FALSE;
}
strsend = "TYPE A\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 200, strret))
{
closesocket(sockid);
return FALSE;
}
strsend = "PASV\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 227, strret))
{
closesocket(sockid);
return FALSE;
}
std::string pasv = strret.substr(strret.find("("));
int a0, a1, a2, a3, p0, p1;
if (sscanf(pasv.c_str(),"(%d,%d,%d,%d,%d,%d)",&a0, &a1, &a2, &a3, &p0, &p1) != 6)
{
int nnn = 0;
}
for (int i = 0; i < paths.size() - 1; ++i)
{
strsend = "CWD ";
strsend = strsend + paths[i] + "\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 250, strret))
{
closesocket(sockid);
return FALSE;
}
}
strsend = "SIZE ";
strsend = strsend + paths[paths.size() - 1] + "\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 213, strret))
{
closesocket(sockid);
return FALSE;
}
ArString fsize;
SplitString(strret, " ", fsize);
int filesize = atoi(fsize[fsize.size() - 1].c_str());
BOOL bWriteFile = FALSE;
if (filesize > SIZE_USETEMP)
bWriteFile = TRUE;
strsend = "REST 0\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 350, strret))
{
closesocket(sockid);
return FALSE;
}
strsend = "RETR ";
strsend = strsend + paths[paths.size() - 1] + "\r\n";
send(sockid, strsend.c_str(), strsend.size(), 0);
if (0 != GetResponseCode(sockid, 150, strret))
{
closesocket(sockid);
return FALSE;
}
int datport = p0 * 256 + p1;
int datsockid = -1;
fd_set fdset;
timeval outtime;
outtime.tv_sec = RECV_TIME_OUT;
outtime.tv_usec = 0;
if((datsockid = socket(PF_INET,SOCK_STREAM, 0)) == -1)
{
closesocket(sockid);
return FALSE;
}
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(datport);
remote_addr.sin_addr = *((in_addr *)hostbyname->h_addr);
memset(&(remote_addr.sin_zero), 0, 8);
if(connect(datsockid,(sockaddr*)&remote_addr, sizeof(remote_addr)) == -1)
{
closesocket(sockid);
closesocket(datsockid);
return FALSE;
}
int ret = TRUE;
FILE* fptmp = NULL;
char* pdat = NULL;
if (bWriteFile)
{
char tmppath[MAX_PATH];
GetTempPath(MAX_PATH, buf);
sprintf(tmppath, "%s\\%d.tmp", buf, ELFHash(url));
if ((fptmp = fopen(tmppath, "w+b")) == NULL)
{
closesocket(sockid);
closesocket(datsockid);
return FALSE;
}
*hfile = fptmp;
}
else
{
pdat = new char[filesize + 1];
*datbuf = pdat;
}
int recvlen = 1024;
char recvbuf[1024 + 1];
int recvedsz = 0;
while(1)
{
FD_ZERO(&fdset);
FD_SET(datsockid, &fdset);
select(datsockid + 1, &fdset, NULL, NULL, &outtime);
if (!FD_ISSET(datsockid, &fdset))
{
ret = FALSE;
break;
}
int bytesize = recv(datsockid, recvbuf, recvlen, 0);
recvbuf[bytesize] = 0;
if(bytesize < 1)
break;
if (recvedsz + bytesize > filesize)
break;
if (bWriteFile)
{
fwrite(recvbuf, 1, bytesize, fptmp);
}
else
{
memcpy(pdat, recvbuf, recvlen);
pdat += bytesize;
}
recvedsz += bytesize;
if (pfunc)
pfunc(url, filesize, recvedsz);
}
if(fptmp)
fseek(fptmp, 0, SEEK_SET);
bufsize = recvedsz;
closesocket(sockid);
closesocket(datsockid);
return ret;
}