#include "StdAfx.h"
#include "Http.h"
CHttp::CHttp(void)
: m_bConnect(false),dwTimeOut(3000),chunked(FALSE)
{
referer="";
cookie="";
}
//http底层提交
bool CHttp::put(CString inbuff,CString *outbuff,CString type)
{
chunked=FALSE;
CString len;
CString content;
CString temp;
if (MySocket==INVALID_SOCKET) return FALSE;
if (m_bConnect==FALSE) return FALSE;
if (type.Compare("img")!=0)
*outbuff="";
int retval=::send(MySocket,(LPCTSTR)inbuff,inbuff.GetLength(),0);
if( SOCKET_ERROR== retval ) return FALSE;
char *buffer=new char[1024];
if (type.Compare("img")==0)
{
CFile file;
file.Open(outbuff->GetString(),CFile::modeCreate|CFile::modeReadWrite);
ZeroMemory(buffer,1024);
retval= recv(MySocket ,buffer,1023,0);
temp=buffer;
int t=temp.Find("\r\n\r\n");
char *loc;
loc=buffer+t+4;
file.SeekToEnd();
file.Write(loc,retval-temp.Find("\r\n\r\n")-4);
while( SOCKET_ERROR!= retval && retval>0 )
{
ZeroMemory(buffer,1024);
retval= recv(MySocket ,buffer,1023,0);
if (retval>0)
{
file.SeekToEnd();
file.Write(buffer,retval);
}
}
file.Close();
}
else
{
WSAEVENT rwE = ::WSACreateEvent();
WSAEventSelect(MySocket, rwE, FD_READ|FD_CLOSE|FD_WRITE);
while(1)
{
int ret=::WSAWaitForMultipleEvents(1, &rwE, FALSE,dwTimeOut, FALSE);
WSANETWORKEVENTS event1;
::WSAEnumNetworkEvents(MySocket, rwE, &event1);
if(event1.lNetworkEvents & FD_READ)
{
ZeroMemory(buffer,1024);
retval= recv(MySocket ,buffer,1023,0);
*outbuff+=buffer;
}
else if(event1.lNetworkEvents & FD_OOB_BIT)
{
ZeroMemory(buffer,1024);
retval= recv(MySocket ,buffer,1023,0);
*outbuff+=buffer;
}
else if(event1.lNetworkEvents & FD_CLOSE)
{
break;
}
else
{
break;
}
if (outbuff->Find("Transfer-Encoding: chunked")>0)
{
chunked=TRUE;
}
else if(outbuff->Find("Content-Length")>0)
{
len=outbuff->Mid(outbuff->Find("Content-Length: ")+16);
len=len.Left(len.Find("\r\n"));
m_nContent=atoi(len);
content=outbuff->Mid(outbuff->Find("\r\n\r\n")+4);
if (content.GetLength()==m_nContent)
break;
}
if(chunked==TRUE )
{
if(outbuff->Find("0\r\n\r\n")>0)
break;
}
}
}
delete buffer;
if (type=="img")
{
BulidCookie(temp);
}
else
{
BulidCookie(*outbuff);
}
return TRUE;
}
CHttp::~CHttp(void)
{
}
//直接get方式访问
bool CHttp::get(CString url,CString *result)
{
CString refer;
refer=url;
url.Replace("http://","");
host=url.Left(url.Find("/"));
WSADATA wsaDATA;
if (WSAStartup(MAKEWORD(2,2),&wsaDATA) != NO_ERROR)
{
::WSACleanup();
return FALSE;
}
LPHOSTENT ip= gethostbyname(host);
if (!m_connect(((LPIN_ADDR)ip->h_addr)->s_addr,"80"))
{
*result="连接错误";
return FALSE;
}
//构造http头
url.Replace(host,"");
CString head= CString("GET ")+url+
CString(" HTTP/1.1\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, */*\r\n")+
CString("Accept-Language: zh-cn\r\n")+
CString("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; );\r\n")+
CString("Host: ")+host+CString("\r\n")+
CString("Connection: Keep-Alive\r\n");
if (nfakeip.Compare("")!=0)
{
head+=(CString("X-Forwarded-For: ")+nfakeip+CString("\r\n"));
}
if (referer.Compare("")!=0)
{
head+=(CString("Referer: ")+referer+CString("\r\n"));
}
if (cookie.Compare("")!=0)
{
head+=(CString("Cookie: ")+cookie+CString("\r\n"));
}
head+=(CString("\r\n"));
//提交http包,结果返回到result指针。
if (!put(head,result,""))
{
*result="提交数据错误";
return FALSE;
}
referer=refer;
closesocket(MySocket);
WSACleanup();
m_bConnect=FALSE;
return TRUE;
}
bool CHttp::get(CString ip,CString port,CString url,CString *result)
{
CString refer;
refer=url;
url.Replace("http://","");
host=url.Left(url.Find("/"));
WSADATA wsaDATA;
if (WSAStartup(MAKEWORD(2,2),&wsaDATA) != NO_ERROR)
{
::WSACleanup();
return FALSE;
}
if (!m_connect(inet_addr(ip),port))
{
*result="连接错误";
return FALSE;
}
//构造http头
url.Replace(host,"");
CString head= CString("GET ")+refer+
CString(" HTTP/1.1\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, */*\r\n")+
CString("Accept-Language: zh-cn\r\n")+
CString("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; );\r\n")+
CString("Host: ")+host+CString("\r\n")+
CString("Connection: Keep-Alive\r\n");
if (nfakeip.Compare("")!=0)
{
head+=(CString("X-Forwarded-For: ")+nfakeip+CString("\r\n"));
}
if (referer.Compare("")!=0)
{
head+=(CString("Referer: ")+referer+CString("\r\n"));
}
if (cookie.Compare("")!=0)
{
head+=(CString("Cookie: ")+cookie+CString("\r\n"));
}
head+=(CString("\r\n"));
//提交http包,结果返回到result指针。
if (!put(head,result,""))
{
*result="提交数据错误";
return FALSE;
}
referer=refer;
closesocket(MySocket);
WSACleanup();
m_bConnect=FALSE;
return TRUE;
}
bool CHttp::m_connect(unsigned long ip,CString port)
{
MySocket =::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (MySocket==INVALID_SOCKET) return false;
//设置超时
int nTimeOut= 10000;
::setsockopt(MySocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nTimeOut,sizeof(int));
sockaddr_in RemoteAddr;
RemoteAddr.sin_family =AF_INET;
RemoteAddr.sin_port = htons(atoi(port));
RemoteAddr.sin_addr.S_un.S_addr = ip;
if (connect(MySocket,(SOCKADDR*)&RemoteAddr,sizeof(SOCKADDR))==SOCKET_ERROR)
{
m_bConnect=FALSE;
return false;
}
else
{
m_bConnect=TRUE;
}
return true;
}
//处理cookie的函数
void CHttp::BulidCookie(CString urlsc)
{
while (urlsc.Find("Set-Cookie: ")!=-1)
{
urlsc=urlsc.Mid(urlsc.Find("Set-Cookie: ")+12);
CString ts,cvalue;
ts=urlsc.Left(urlsc.Find(";")+1);
if (cookie.Find(ts.Left(ts.Find("=")))!=-1)
{
cvalue=cookie.Mid(cookie.Find(ts.Left(ts.Find("="))));
cvalue=cookie.Mid(cookie.Find("=")+1);
cvalue=cvalue.Left(cvalue.Find(";")+1);
cookie.Replace(cvalue,ts.Mid(ts.Find("=")+1));
}
else
{
cookie+=(ts+"");
}
cvalue.Empty();
cvalue.FreeExtra();
ts.Empty();
ts.FreeExtra();
}
}
bool CHttp::post(CString url, CString pstr, CString* result)
{
CString refer=url;
url.Replace("http://","");
host=url.Left(url.Find("/"));
WSADATA wsaDATA;
if (WSAStartup(MAKEWORD(2,2),&wsaDATA) != NO_ERROR)
{
::WSACleanup();
return FALSE;
}
LPHOSTENT ip= gethostbyname(host);
if (!m_connect(((LPIN_ADDR)ip->h_addr)->s_addr,"80"))
{
*result="连接错误";
return FALSE;
}
//构造http头
int len;
len=pstr.GetLength();
CString slen;
slen.Format("%d\r\n",len);
url.Replace(host,"");
CString head= CString("POST ")+url+
CString(" HTTP/1.1\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, */*\r\n")+
CString("Content-Type: application/x-www-form-rulencoded\r\n")+
CString("Accept-Language: zh-cn\r\n")+
CString("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; );\r\n")+
CString("Host: ")+host+CString("\r\n")+
CString("Content-Length: ")+slen+
CString("Connection: Keep-Alive\r\n");
if (nfakeip.Compare("")!=0)
{
head+=(CString("X-Forwarded-For: ")+nfakeip+CString("\r\n"));
}
if (referer.Compare("")!=0)
{
head+=(CString("Referer: ")+referer+CString("\r\n"));
}
if (cookie.Compare("")!=0)
{
head+=(CString("Cookie: ")+cookie+CString("\r\n"));
}
head+=(CString("\r\n"));
head+=pstr;
//提交http包,结果返回到result指针。
if (!put(head,result,""))
{
*result="提交数据错误";
return FALSE;
}
referer=refer;
closesocket(MySocket);
WSACleanup();
m_bConnect=FALSE
- 1
- 2
- 3
- 4
前往页