最近项目需要用到网页抓取下载等,简单说就是编写一个可用的httpClient,故总结如下。
CInternetSession session("HttpClient"); //会话
CHttpFile * pfile = NULL ;
CString content;
pfile=(CHttpFile *)session.OpenURL(url);
DWORDdwStatusCode;
pfile-> QueryInfoStatusCode(dwStatusCode);
if(dwStatusCode ==HTTP_STATUS_OK)
{
//charsRev[1024];
CString data;
while (pfile ->ReadString(data))
{
content +=
data;
}
content.TrimRight();
printf(" %s\n ",(LPCTSTR)content);
}
pfile -> Close();
delete pfile;
session.Close();
【说
明】:这是因为MFC要使用多线程时库
【解决
方法】:[Project] -->[Settings] --> 选择"C/C++"属性页,
在Category中选择CodeGeneration,
再在Userun-time library中选择DebugMultithreaded或者multithreaded
【说
明】:服务器中文编码格式与客户端中文编码格式不一致。
遇到的情况是,Server是采用UTF-8,故接收后要再进行ASCII转码
【解决
方法】:从utf8编码的char*转为ucs2的wchar_t*,
再用WideCharToMultiByte转为
ASCII的char*。
//notepad++源码里面的utf8_to_ascii函数就完成了所需的转换。
CString data;
while(pfile -> ReadString(data))
{
char*pStr = data.GetBuffer(data.GetLength());//取得str对象的原始字符串
intnBufferSize = MultiByteToWideChar(CP_UTF8, 0, pStr, -1, NULL, 0);//取得所需缓存的多少
wchar_t *pBuffer =(wchar_t*)malloc(nBufferSize *sizeof(wchar_t));//申请缓存空间
MultiByteToWideChar(CP_UTF8, 0, pStr, -1 , pBuffer,nBufferSize*sizeof(wchar_t));//转码
content + = pBuffer;
free(pBuffer);//释放缓存
}
//得到content
先是Windows下,发现用MFC的话,可以直接利用CInternetSession和CHttpFile,简单实现如下:
//需要导入库
#include "stdio.h"
#include "afxinet.h"
char * url = "http://www.baidu.com";
int main(int argc, char* argv[])
{
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
可能出现问题:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1.【VC++ 6.0编译错误】:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved externalsymbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved externalsymbol __endthreadex
2.【中文乱码问题】:抓包显示中文乱码
转码code如下: