⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hhttp.cpp

📁 积下的一点C++编程序库源码
💻 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 + -