C++实现http下载问题今天用C++实现一个http下载文件程序的流程是这样的:先取到文件大小向服务器发包取1
C++实现http下载问题
今天用C++实现一个http下载文件程序的流程是这样的:先取到文件大小==>向服务器发包取102400个字节的数据==>不停接收写文件==>向服务器发包取下一个102400个字节的数据==>不停接收写文件==>直到文件下载完毕
但文件下载到一段时间后就会报“Connection reset by peer”,请解。
下面是部分代码
- C/C++ code
// 格式化请求头void CHttpGet::formatReqHead(long lFrom/* = 0 */, long lTo/* = 0 */, bool bType/* = true */){ char temp[125]; m_sReqHead = ""; m_sReqHead += "GET "; m_sReqHead += m_sGet; m_sReqHead += " HTTP/1.1\r\n"; m_sReqHead += "Accept: */*\r\n"; //m_sReqHead += "Referer: http://localhost/index.html\r\n"; //m_sReqHead += "Accept-Language: zh-cn\r\n"; // utf-8 //m_sReqHead += "Accept-Encoding: gzip, deflate\r\n"; //m_sReqHead += "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"; memset(temp, 0x00, sizeof(temp)); sprintf(temp, "Host: %s:%d\r\n", m_sHost.c_str(), m_iPort); m_sReqHead += string(temp); m_sReqHead += "Connection: Keep-Alive\r\n"; if (!bType) { memset(temp, 0x00, sizeof(temp)); sprintf(temp, "Range: bytes=%ld-%ld\r\n", lFrom, lTo); m_sReqHead += string(temp); } m_sReqHead += "\r\n"; std::cout << "****m_sReqHead:" << std::endl; std::cout << "******************" << std::endl; std::cout << m_sReqHead; std::cout << "******************" << std::endl; return;}// 写文件bool CHttpGet::writeBlock(long lOffset, long lLen){ formatReqHead(lOffset, lOffset + lLen - 1, false); // 格式化请求头 if (!sendReqHead()) // 发送请求头 { std::cout << "[writeBlock][sendReqHead error]" << std::endl; return -1; } if (!m_fsDestFile.is_open()) m_fsDestFile.open(m_sDestFile.c_str(), ios::binary|ios::in|ios::out); if (!m_fsDestFile) { std::cout << "cannot open file: " << m_sDestFile << std::endl; return false; } int iRecvBytes = 0; int iAllRecvBytes = 0; char cBuff[MAX_RCVBLOCK_SIZE + 1]; while(1) { memset(cBuff, 0x00, sizeof(cBuff)); iRecvBytes = recv(m_iSock, cBuff, MAX_RCVBLOCK_SIZE, 0); if (iRecvBytes > 0) { m_fsDestFile.seekp(m_lRecvLen, ios::beg); m_fsDestFile.write(cBuff, iRecvBytes); iAllRecvBytes += iRecvBytes; m_lRecvLen += iRecvBytes; } else if (iRecvBytes < 0) { std::cout << "iRecvBytes = " << iRecvBytes << " " << errno << ":" << strerror(errno) << std::endl; std::cout << "iRecvBytes:" << iRecvBytes << " iAllRecvBytes: " << iAllRecvBytes << " m_lRecvLen: " << m_lRecvLen << " m_lTotalLen: " << m_lTotalLen << std::endl; return false; } std::cout << "iRecvBytes:" << iRecvBytes << " iAllRecvBytes: " << iAllRecvBytes << " m_lRecvLen: " << m_lRecvLen << " m_lTotalLen: " << m_lTotalLen << std::endl; if (iAllRecvBytes >= lLen) break; } std::cout << "=====m_lRecvLen:" << m_lRecvLen << " iAllRecvBytes: " << iAllRecvBytes << std::endl; return true;}[解决办法]
所需头文件
//windows头文件
#include <afx.h>
#include <afxinet.h>
------解决方案--------------------
[解决办法]
一个简单的命令行就搞定了
system("wget www.vijaymukhi.com/vmis/index.html -O /D13879EB5608/qqwry.dat");
[解决办法]
[解决办法]
