
第一种方法是在MFC中使用
复制代码mfc socket onclose,代码如下:
CString GetHttpFileData(CString strUrl)
{
CInternetSession会话(“ Internet Explorer”mfc socket onclose,0);
CHttpFile * pHttpFile = NULL;
CString strData;
CString strClip;
pHttpFile =(CHttpFile *)Session.OpenURL(strUrl);
while(pHttpFile-> ReadString(strClip))
{
strData + = strClip;
}
返回strData;
}
要说的是,pHttpFile-> ReadString()一次只能读取一个数据,并且读取的次数取决于网络状况,因此有必要将每次读取的数据添加到总数据的末尾,使用CString保存转到缓冲区处理: )
别忘了包含头文件#include
第二个是使用WinNet的纯API实现的
复制代码,代码如下:
#define MAXBLOCKSIZE 1024
#include
#include
#pragma注释(lib,“ wininet.lib”)
void GetWebSrcCode(const char * Url);
int _tmain(int argc,_TCHAR * argv [])
{
GetWebSrcCode(“ // www.jb51.net /”);
返回0;
}

void GetWebSrcCode(常量字符*网址)
{
HINTERNET hSession = InternetOpen(“ zwt”,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
如果(hSession!= NULL)
{
HINTERNET hURL = InternetOpenUrl(hSession,Url,NULL,0,INTERNET_FLAG_DONT_CACHE,0);
如果(hURL!= NULL)
{
字符温度[MAXBLOCKSIZE] = {0};
ULONG Number = 1;
FILE *流;
if((stream = fopen(“ E: \\ test.html”,“ wb”))!= NULL)
{
同时(Number> 0)
{
InternetReadFile(hURL,Temp,MAXBLOCKSIZE-1和数字);
fwrite(温度,sizeof(字符),数字,流);
}
fclose(流);
}
InternetCloseHandle(hURL);
hURL = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}
}
第三种是使用未封装的套接字
复制代码,代码如下:
int main(int argc,char * argv [])

{
SOCKET hsocket;
SOCKADDR_IN saServer;
WSADATA wsadata;
LPHOSTENT lphostent;
int nRet;
char Dest [3000];
char * host_name =“ blog.sina.com.cn”;
char * req =“ GET /s/blog_44acab2f01016gz3.html HTTP / 1.1 \ r \ n”
“用户代理: Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 5.1; Trident / 4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E;. NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\ r \ n“
“主持人: blog.sina.com.cn \ r \ n \ r \ n”;
//初始化套接字
如果(WSAStartup(MAKEWORD(2,2),&wsadata))
printf(“初始化SOCKET时出错!”);
lphostent = gethostbyname(host_name);
如果(lphostent == NULL)
printf(“ lphostent为空!”);
hsocket =套接字(AF_INET,SOCK_STREAM,IPPROTO_TCP);
saServer.sin_family = AF_INET;
saServer.sin_port = htons(80);
saServer.sin_addr = *(((LPIN_ADDR)* lphostent-> h_addr_list);
//与SOCKET连接
nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));
如果(nRet == SOCKET_ERROR)
{
printf(“建立连接时发生错误!”);
closesocket(hsocket);
返回0;
}
// SOCKET发送

nRet =发送(hsocket,req,strlen(req),0);
如果(nRet == SOCKET_ERROR)
{
printf(“发送数据包时发生错误!”);
closesocket(hsocket);
}
nRet = 1;
同时(nRet> 0)
{
//接收返回包
nRet = recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);
如果(nRet> 0)
目标[nRet] = 0;
其他
目标[0] = 0;
char sDest [3000] = {0};
UTF8_2_GB2312(sDest,nRet,Dest,nRet);
//显示返回的数据包的大小和内容
// printf(“ \ n接收的字节: %d \ n”,nRet);
printf(“结果: \ n%s”,sDest);
}
}
此外,当我们获得上面的网页时,它可能是UTF8. 似乎大多数网站现在都使用这种编码!以下是代码转换.
复制代码,代码如下:
void UTF_8ToUnicode(wchar_t * pOut,char * pText)
{
char * uchar =(char *)pOut;
uchar [1] =((pText [0]&0x0F)<< 4)+((pText [1] >> 2)&0x0F);
uchar [0] =((pText [1]&0x03)<< 6)+(pText [2]&0x3F);
}
void Gb2312ToUnicode(wchar_t * pOut,char * gbBuffer)
{
:: MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
}
void UTF_8ToGB2312(char * pOut,char * pText,int pLen)
{
char Ctemp [4];
内存集(Ctemp,0,4);
int i = 0,j = 0;
同时(i { if(pText [i]> = 0) { pOut [j ++] = pText [i ++]; } 其他 { WCHAR Wtemp; UTF_8ToUnicode(&Wtemp,pText + i); UnicodeToGB2312(Ctemp,Wtemp); pOut [j] =温度[0]; pOut [j + 1] =体温[1]; i + = 3; j + = 2; } } pOut [j] ='\ n'; 返回; } 这是转换为GB2312的代码
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-163927-1.html
1
不击沉也要拦截撞击