18,356
社区成员
发帖
与我相关
我的任务
分享
CHttpAction::CHttpAction()
{
m_hSocket = INVALID_SOCKET;
return;
}
CHttpAction::CHttpAction(char *pHostName)
{
m_hSocket = INVALID_SOCKET;
memset(m_sHostName,0,sizeof(m_sHostName));
strcpy(m_sHostName,pHostName);
CreateSocket(pHostName,80);
return;
}
CHttpAction::~CHttpAction()
{
}
/*************************************
* 函数名称:CreateSocket
* 函数功能:
* 输入参数:pHostName:主机名;iPort端口号
* 输出参数:
* 返 回 值:
*************************************/
int CHttpAction::CreateSocket(char *pHostName,u_int16_t iPort=80)
{
int nRet;
memset(&m_sockAddr,0,sizeof(m_sockAddr));
struct hostent *newHost;
newHost = gethostbyname(pHostName);
if(NULL==newHost)
{
return FUNCTION_ERROR;
}
memset(m_sIpAddress,0,sizeof(m_sIpAddress));
strcpy(m_sIpAddress,inet_ntoa(*(in_addr *)newHost->h_addr_list[0]));
m_iIpAddress = inet_addr(m_sIpAddress);
m_sockAddr.sin_family = AF_INET;
m_sockAddr.sin_port = htons(iPort);
m_sockAddr.sin_addr.s_addr = m_iIpAddress;
m_hSocket = socket(AF_INET,SOCK_STREAM,0);
nRet = connect(m_hSocket,(struct sockaddr *)&m_sockAddr,sizeof(m_sockAddr));
if(nRet==SOCKET_ERROR)
{
fprintf(stderr,"connect error:%d\n",WSAGetLastError());
return FUNCTION_ERROR;
}
return FUNCTION_NORMAL;
}
/*************************************
* 函数名称:FetchHttpPage
* 函数功能:下载网页到本地文件
* 输入参数:pHttpUrl要下载的网页URL地址
* 输出参数:
* 返 回 值:
*************************************/
int CHttpAction::FetchHttpPage(char *pHttpUrl)
{
int nRet;
DWORD dwContentLength = 0;
char *pSt,*pEnd;
char sHttpReqest[1024];
char sHostName[MAX_HOST_NAME_LEN];
//获得主机名
memset(sHostName,0,sizeof(sHostName));
pSt = strstr(pHttpUrl,"://");
if(pSt==NULL)
{
pEnd = strchr(pHttpUrl,'/');
if(NULL==pEnd) strcpy(sHostName,pHttpUrl);
else strncpy(sHostName,pHttpUrl,pEnd-pHttpUrl);
}
else
{
pEnd = strchr(pSt+strlen("://"),'/');
if(NULL==pEnd) strcpy(sHostName,pSt+strlen("://"));
else strncpy(sHostName,pSt+strlen("://"),pEnd-(pSt+strlen("://")));
}
memset(sHttpReqest,0,sizeof(sHttpReqest));
sprintf(sHttpReqest,"GET %s HTTP/1.1\r\nAccept:*/*\r\nAccept-Language:zh-cn\r\n",pHttpUrl,HTTP_VERSION);
sprintf(sHttpReqest,"%sUser-Agent:Mozilla/4.0 (compatible;MSIE 7.0;Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n",sHttpReqest);
sprintf(sHttpReqest,"%sHost:%s\r\n",sHttpReqest,sHostName);
sprintf(sHttpReqest,"%sConnection: Close\r\n\r\n",sHttpReqest);
nRet=send(m_hSocket,sHttpReqest,strlen(sHttpReqest),0);
if(nRet==SOCKET_ERROR)
{
fprintf(stderr,"send HttpReqest error:%d\n",WSAGetLastError());
return FUNCTION_ERROR;
}
//等待服务器响应,回传数据
struct timeval timeout;
timeout.tv_sec = 10;
fd_set fdReads;
char strHttpRespones[1024];
dwContentLength = 0;
while(1)
{
FD_ZERO(&fdReads);
FD_SET(m_hSocket,&fdReads);
select(m_hSocket+1,&fdReads,NULL,NULL,&timeout);
if(FD_ISSET(m_hSocket,&fdReads))
{
sprintf(strHttpRespones,"recv HttpRespones error:%d\n",WSAGetLastError());
nRet=recv(m_hSocket,strHttpRespones,sizeof(strHttpRespones)-1,0);
if(nRet==SOCKET_ERROR)
{
fprintf(stderr,"recv HttpRespones error:%d\n",WSAGetLastError());
return FUNCTION_ERROR;
}
dwContentLength += nRet;
strHttpRespones[nRet] = 0;
g_sHtmlBuffer[0] += strHttpRespones;
while (1)
{
memset(strHttpRespones, 0, sizeof(strHttpRespones));
int iRet = recv(m_hSocket,strHttpRespones,sizeof(strHttpRespones)-1,0);
strHttpRespones[nRet] = 0;
if (iRet == WSAECONNRESET || iRet == SOCKET_ERROR || iRet <= 0)
break;
g_sHtmlBuffer[0] += strHttpRespones;
dwContentLength += nRet;
}
break;
}
}
return FUNCTION_NORMAL;
}