简介本文介绍一个C++代码片段:C++通过HTTP下载文件,感兴趣的朋友可以参考一下。
代码片段
// 下载HTTP文件
bool DownloadHttpFile(CString strUrl, CString strSavePath)
{
if (strUrl.IsEmpty() || strSavePath.IsEmpty())
{
return false;
}
CInternetSession session;
CHttpConnection* pHttpConnection = NULL;
CHttpFile* pHttpFile = NULL;
bool bReturn = false;
const int nTimeOut = 2000;
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); // 重试之间的等待延时
session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); // 重试次数
char* pszBuffer = NULL;
try
{
// 打开一个URL
pHttpFile = (CHttpFile*)session.OpenURL(strUrl.GetBuffer(), 1, INTERNET_FLAG_TRANSFER_ASCII | INTERNET_FLAG_RELOAD, NULL, 0);
if (pHttpFile->SendRequest() == FALSE) return FALSE;
DWORD dwStateCode;
pHttpFile->QueryInfoStatusCode(dwStateCode);
if (dwStateCode == HTTP_STATUS_OK)
{
HANDLE hFile = CreateFile(strSavePath, GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
pHttpFile->Close();
pHttpConnection->Close();
session.Close();
return FALSE;
}
char szInfoBuffer[1000]; // 返回消息
DWORD dwFileSize = 0; // 文件长度
DWORD dwInfoBufferSize = sizeof(szInfoBuffer);
BOOL bResult = FALSE;
bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,
(void*)szInfoBuffer, &dwInfoBufferSize, NULL);
dwFileSize = atoi(szInfoBuffer);
const int BUFFER_LENGTH = 1024 * 10;
pszBuffer = new char[BUFFER_LENGTH]; // 读取文件的缓冲
DWORD dwWrite, dwTotalWrite;
dwWrite = dwTotalWrite = 0;
UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); // 读取服务器上数据
while (nRead > 0)
{
WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL);
dwTotalWrite += dwWrite;
nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);
}
delete[] pszBuffer;
pszBuffer = NULL;
CloseHandle(hFile);
bReturn = true;
}
}
catch (...)
{
OutputDebugStringA("下载文件失败...");
}
if (pszBuffer != NULL)
{
delete[]pszBuffer;
}
if (pHttpFile != NULL)
{
pHttpFile->Close();
delete pHttpFile;
}
if (pHttpConnection != NULL)
{
pHttpConnection->Close();
delete pHttpConnection;
}
session.Close();
return bReturn;
}
本文向大家介绍一个C++实战项目:Libevent网络库实现简单TCP服务端及客户端,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:手把手教你了解并解决TCP粘包问题。通过该实战项目可以了解TCP粘包问题产生的原因及解决方式,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++使用Websocket++实现WebSocket客户端通信,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:libcurl实现上传文件支持中文路径,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++多线程实现TCP服务器端同时和多个客户端通信。服务器同时可以和多个客户端建立连接,进行交互,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++多线程实现并发TCP客户端测试程序。客户端支持同时自定义多个线程与服务端进行连接,并发发送数据,可用于测试服务端吞吐性能,具有一定的C++实战价值,感兴趣的朋友可以参考一下。