📄 hhttp.cpp
字号:
// HHttpConnect.cpp: implementation of the CHHttp class.
//
//////////////////////////////////////////////////////////////////////
#include "HHttp.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
char CHHttp::m_szBaseHead[]="accept:www/source;text/html;image/gif;image/jpeg;*/*\r\n\
User_Agent:myself Http/1.0\r\n\r\n";
char CHHttp::m_szHttpVer[]=" HTTP/1.0\r\n";
CHHttp::CHHttp()
{
}
CHHttp::~CHHttp()
{
}
BOOL CHHttp::Get(char *url, char *saveFile)
{
CHTcpSock s;
int len;
char Buf[1024];
if(url!=UNI_NULL)
{
strcpy(Buf,"GET ");
strcat(Buf,url);
strcat(Buf,m_szHttpVer);
strcat(Buf,m_szBaseHead);
if(s.CreateConnect(m_IP,m_Port))
{
if(-1!=s.Send(Buf,strlen(Buf)) && saveFile!=UNI_NULL)
{
len=this->HttpRecvFile(Buf,sizeof(Buf),saveFile,s);
}
s.Close();
}
}
return len>0;
}
void CHHttp::SetHost(UNI_DWORD dwIP, UNI_WORD Port)
{
this->m_IP=dwIP;
this->m_Port =Port;
}
int CHHttp::Head(char *url,char *headBuf, int bufLen)
{
CHTcpSock s;
int recvLen,totalLen;
if(headBuf!=UNI_NULL && bufLen > (int )(sizeof(m_szBaseHead)+sizeof(m_szHttpVer)+5+strlen(url)))
{
strcpy(headBuf,"Head ");
strcat(headBuf,url);
strcat(headBuf,m_szHttpVer);
strcat(headBuf,this->m_szBaseHead);
if(s.CreateConnect(m_IP,m_Port))
{
if(-1!=s.Send(headBuf,strlen(headBuf)))
{
for(totalLen=0;totalLen<bufLen;)
{
recvLen=s.Recv(headBuf+totalLen,bufLen);
if(recvLen<=0)
break;
totalLen+=recvLen;
recvLen=this->FindDoubleLf(headBuf,totalLen);
if(recvLen!=-1)
break;
}
if(recvLen<=0)
totalLen=0;
}
s.Close();
}
}
return totalLen;
}
/*
* recvBuf 接收缓冲区
* bufLen 接收缓冲区大小要足够大,能容下HTTP头
* fileName 保存到文件名
*/
int CHHttp::HttpRecvFile(char *recvBuf,int bufLen ,char *fileName, CHTcpSock &s)
{
int recvLen,totalLen,fileLen;
HStdFile file;
for(totalLen=0;totalLen<bufLen;)
{
recvLen=s.Recv(recvBuf+totalLen,bufLen);
if(recvLen<=0)
return -1;
totalLen+=recvLen;
recvLen=this->FindDoubleLf(recvBuf,totalLen);
if(recvLen!=-1)
break;
}
recvBuf[recvLen]=0;
recvLen+=2;
if(totalLen==0)
return -1;
fileLen=this->GetFileLen(recvBuf);
if(file.CreateNew(fileName))
{
if(totalLen!=recvLen)
{
file.Write(recvBuf+recvLen,totalLen-recvLen);
}
totalLen=totalLen-recvLen;
recvLen=s.Recv(recvBuf,bufLen);
if(recvLen>0 )
{
do {
totalLen+=recvLen;
if(recvLen!=(int )file.Write(recvBuf,recvLen))
break;
recvLen=s.Recv(recvBuf,bufLen);
} while(recvLen>0);
}
file.Close();
}
if(fileLen==-1)
return totalLen;
return fileLen==totalLen?fileLen:-1;
}
int CHHttp::FindDoubleLf(char *pBuf, int Maxlen)
{
int i;
i=0;
while(i<Maxlen)
{
for(;i<Maxlen;i++)
{
if(pBuf[i]=='\r' && pBuf[i+1]=='\n')
{
i+=2;
break;
}
}
if(pBuf[i]=='\r' && pBuf[i+1]=='\n')
return i;
}
return -1;
}
int CHHttp::GetFileLen(char *head)
{
char *pos;
int i;
if(pos=strstr(head,"\r\nContent-Length"))
{
if(pos=strstr(pos,":"))
{
pos++;
while (pos[0]==' ')pos++;
if(pos[0]>'9'|| pos[0] < '0')
return -1;
i=0;
while (!(pos[0]>'9'|| pos[0] < '0') )
{
i*=10;
i+=(pos[0]-'0');
pos++;
}
return i;
}
}
return -1;
}
UNI_DWORD CHHttp::ParseURL(char *url, UNI_WORD &wPort)
{
UNI_DWORD dwLen;
UNI_DWORD dwIp;
hostent *p;
char *pTemp;
char Buf[6];
char Domen[256];
if((pTemp=strstr(url,"://"))==UNI_NULL)
return -1;
dwLen=((UNI_DWORD)pTemp)-((UNI_DWORD)url);
if(dwLen>sizeof(Buf))
return -1;
strncpy(Buf,url,sizeof(Buf));
url=pTemp+3;
Buf[dwLen]=0;
if(stricmp(Buf,"http")!=0)
return -1;
if(strlen(url)>sizeof(Domen))
return -1;
wPort=80;
strncpy(Domen,url,sizeof(Domen));
pTemp=strchr(Domen,'/');
if(pTemp==UNI_NULL)
{
if(pTemp=strchr(Domen,':'))
{
pTemp[0]=0;
pTemp++;
wPort=8080;
}
else if(pTemp=strchr(Domen,'?'))
{
pTemp[0]=0;
pTemp=UNI_NULL;
}
}
else
{
pTemp[0]=0;
if(pTemp=strchr(Domen,':'))
{
pTemp[0]=0;
pTemp++;
wPort=8080;
}
}
if(p=gethostbyname(Domen))
{
dwIp=*((DWORD *)p->h_addr_list[0]);
return dwIp;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -