搜档网
当前位置:搜档网 › 访问网页的c程序

访问网页的c程序


#include
#include
#include
#include


#define MAXHEADERSIZE 1024
#define true 0
#define false -1
#include

char m_requestheader[1024];
char m_requesproxytheader[1024];
char m_ResponseHeader[1024];
int m_port = 80;
char m_ipaddr[256];
int m_bConnected = 0;
int m_s = 0;
struct hostent *m_phostent = NULL;

int m_nCurIndex = 0;
int m_bResponsed = 0;
int m_nResponseHeaderSize = -1;

int GetServerState();
int GetField(const char* szSession,char *szValue);
int GetResponseLine(char *pLine,int nMaxLength);
const char *GetResponseHeader(int Length);
long FormatRequestHeader(char *pServer,char *pObject,char* pCookie,char *pReferer,long nFrom,long nTo,int nServerType);
const int GetRequestHeader(char *pHeader,int nMaxLength);
int SendRequest(const char* pRequestHeader,long Length);
long Receive(char* pBuffer,long nMaxLength);
int Connect(char* szHostName,int nPort);
bool Auth_Proxy();
int CloseSocket();
int Socket();

int main(void)
{
int i;
FILE *stream;

for(i=0;i<256;i++)
m_ipaddr[i]='\0';
memset(m_requestheader,0,MAXHEADERSIZE);
memset(m_ResponseHeader,0,MAXHEADERSIZE);

//char *strServer = "https://www.sodocs.net/doc/715748544.html,";
//char *strObject = "/rsrc.php/v2/yx/r/pyNVUg5EM0j.png";

//char *strServer = "https://www.sodocs.net/doc/715748544.html,";
//char *strObject = "/otn/resources/js/rich/calender_double/datepicker/WdatePicker.js";


//char *strServer = "https://www.sodocs.net/doc/715748544.html,";
//char *strObject = "https://www.sodocs.net/doc/715748544.html,/video/index.html";

char *strServer = "https://www.sodocs.net/doc/715748544.html,";
char *strObject = "https://www.sodocs.net/doc/715748544.html,/video/svb5-0b99473afd234d208b53dbfdbab72f7f001.html.台中公共自行車「iBike」亮相.html";

//char strServer;
//char strObject;
//DWORD dwServiceType;
long nLength;
//INTERNET_PORT nPort;
//AfxParseURL("https://www.sodocs.net/doc/715748544.html,/s/blog_70b8886401010lnw.html",CString& dwServiceType,CString& strServer,strObject,nPort);

nLength = FormatRequestHeader(strServer,strObject,NULL,NULL,0,0,0);
Socket();//-------
Connect(strServer,80);//---------
//Auth_Proxy();
/*
char m_connectheader[1024];
strcat(m_connectheader,"CONNECT 127.0.0.1:8580 HTTP/1.1\r\nUser-Agent: MyApp/0.1\r\n\r\n");

long Length;

Length=strlen(m_connectheader);
if(send(m_s,m_connectheader,Length,0)==-1)
{
printf("connect send error\n");
return false;
}

int aLength;
GetResponseHeader(aLength);
*/

SendRequest(NULL,0);//-----------
char szValue[30];
GetField("Content-Length",szValue);
int nFileSize = atoi(szValue);

int nCompletedSize = 0;

char pData[1024];
int nReceSize = 0;

if ((stream = fopen("rsqs.html", "w+")) == NULL)
{
printf("can not open file");
}

while((nCompletedSize < nFileSize) && (stream != NULL))
{
nReceSize = Receive(pData,1024);
if(nReceSize == 0)
{
printf("receive from server only 0!(finish)\n");
break;
}
else if(nReceSize == -1)
{
printf("receive from server err

or!\n");
break;
}
else
{
fwrite(pData, nReceSize, 1, stream);
printf("have writed strlen(pData) = %d\n",strlen(pData));
printf(pData);
}
printf("size = %d\n",nReceSize);
}
fclose(stream);
CloseSocket();
return 0;
}


//初始化本地socket,设置收发包的等待时间为5s。
int Socket()
{


if(m_bConnected)return false;
WSADATA wsd;
int err;
err = WSAStartup(MAKEWORD(2,2),&wsd);
m_s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int timeout = 5000; //3s
int ret=setsockopt(m_s,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout));
int ret1=setsockopt(m_s,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout));
printf("m_s %d\n",m_s);
if(m_s==-1)
{
printf("open socket error!\n");
return false;
}

return true;

}




//建立socket连接函数,根据需求可以修改与服务器或者代理通信
int Connect(char *szHostName,int nPort)
{
if(szHostName==NULL)
return false;

if(m_bConnected)
{
CloseSocket();
}

m_port=nPort;


//m_phostent=gethostbyname(szHostName);
m_phostent=gethostbyname("localhost");


if(m_phostent==NULL)
{
printf("gethostbyname error!\n");
return false;
}

struct sockaddr_in destaddr;
memset((void *)&destaddr,0,sizeof(destaddr));
destaddr.sin_family=AF_INET;
destaddr.sin_port=htons(8580);
destaddr.sin_addr=*((struct in_addr *)m_phostent->h_addr);
//destaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //("61.174.9.96");//使用代理的ip地址
printf("ms = %d\n",m_s);
if(connect(m_s,(struct sockaddr*)&destaddr,sizeof(struct sockaddr))==-1)
{
printf("Can not connect!\n");
return false;
}

m_bConnected=1;

return true;
}



//封装HTTP请求头
long FormatRequestHeader(char *pServer,char *pObject, char *pCookie,char *pReferer,long nFrom,long nTo,int nServerType)
{
char szPort[10];
char szTemp[20];
long Length;
sprintf(szPort,"%d",m_port);
memset(m_requestheader,'\0',1024);

strcat(m_requestheader,"GET ");
strcat(m_requestheader,pObject);
strcat(m_requestheader," HTTP/1.1");
strcat(m_requestheader,"\r\n");

strcat(m_requestheader,"Accept-Language: zh-cn");
strcat(m_requestheader,"\r\n");

strcat(m_requestheader,"Accept: image/gif, image/jpeg, */*");
strcat(m_requestheader,"\r\n");

strcat(m_requestheader,"Accept-Encoding: gzip, deflate");
strcat(m_requestheader,"\r\n");

strcat(m_requestheader,"Host:");
strcat(m_requestheader,pServer);
strcat(m_requestheader,"\r\n");

strcat(m_requestheader,"User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)\r\n");

strcat(m_requestheader,"Connection:Keep-Alive");
strcat(m_requestheader,"\r\n");

strcat(m_requestheader,"\r\n");

Length=strlen(m_requestheader);
return Length;
}



//发送HTTP请求头
in

t SendRequest(const char *pRequestHeader, long Length)
{
if(!m_bConnected)return false;

if(pRequestHeader==NULL)
pRequestHeader=m_requestheader;
if(Length==0)
Length=strlen(m_requestheader);

if(send(m_s,pRequestHeader,Length,0)==-1)
{
printf("send error\n");
return false;
}
printf("send ok\n");
int nLength;
GetResponseHeader(nLength);
return true;
}



//接受服务器或者代理发送过来的数据包
long Receive(char* pBuffer,long nMaxLength)
{
if(!m_bConnected)return -1;

long nLength;
nLength=recv(m_s,pBuffer,nMaxLength,0);

if(nLength <= 0)
{
printf("receive error! %d\n",nLength);
CloseSocket();
}
return nLength;
}



//关闭socket
int CloseSocket()
{
if(m_s != -1)
{
if(closesocket(m_s)==-1)
{
printf("closesocket error!\n");
return false;
}
}
m_s = -1;
m_bConnected=0;
return true;
}



//获取HTTP请求头
const int GetRequestHeader(char *pHeader, int nMaxLength)
{
int nLength;
if(strlen(m_requestheader) > nMaxLength)
{
nLength=nMaxLength;
}
else
{
nLength=strlen(m_requestheader);
}
memcpy(pHeader,m_requestheader,nLength);
return nLength;
}



//获取HTTP响应头
const char *GetResponseHeader(int nLength)
{
if(!m_bResponsed)
{
char c = 0;
int nIndex = 0;
int bEndResponse = 0;
while(!bEndResponse && nIndex < MAXHEADERSIZE)
{
recv(m_s,&c,1,0);
m_ResponseHeader[nIndex++] = c;
if(nIndex >= 4)
{
if(m_ResponseHeader[nIndex - 4] == '\r' && m_ResponseHeader[nIndex - 3] == '\n'
&& m_ResponseHeader[nIndex - 2] == '\r' && m_ResponseHeader[nIndex - 1] == '\n')
bEndResponse = 1;
}
}
m_nResponseHeaderSize = nIndex;
m_bResponsed = 1;
}
printf("response length =%d\n",m_nResponseHeaderSize);
printf("response content =%s\n",m_ResponseHeader);
nLength = m_nResponseHeaderSize;
return m_ResponseHeader;
}



int GetResponseLine(char *pLine, int nMaxLength)
{
if(m_nCurIndex >= m_nResponseHeaderSize)
{
m_nCurIndex = 0;
return -1;
}

int nIndex = 0;
char c = 0;
do
{
c = m_ResponseHeader[m_nCurIndex++];
pLine[nIndex++] = c;
} while(c != '\n' && m_nCurIndex < m_nResponseHeaderSize && nIndex < nMaxLength);

return nIndex;
}


//获取网页内容
int GetField(const char *szSession, char *szValue)
{
if(!m_bResponsed) return -1;
printf("GetField\n");
char strRespons[1024];
strcpy(strRespons, m_ResponseHeader);
char *p = NULL;
p = strtok(strRespons, "\r\n");
while(p)
{
if (0 == strncmp(p, szSession, 14))
{
strcpy(szValue,p+16);
printf("Content-Length: %s\n",szValue);
break;
}
else
{
printf("no Content-Length\n");
p = strtok(NULL, "\r\n");
}
}
return 0;
}


bool Auth_Proxy()
{
//发送代理请求
char pBuffer[1024];
long nMaxLength;
char pRequestProxyHeader[2048];
long nLength;

memset(pRequestProxyHeader,'\0',1024);

strcat(pR

equestProxyHeader,"Proxy-Authorization");
strcat(pRequestProxyHeader,"\r\n");

strcat(pRequestProxyHeader,"Basic eXVsb3JlOll1bG9yZVByb3h5MjAxMzo=");
strcat(pRequestProxyHeader,"\r\n");

strcat(pRequestProxyHeader,"User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1");
strcat(pRequestProxyHeader,"\r\n");

strcat(pRequestProxyHeader,"Accept text/html,application/xhtml+xml,application/xml;q=0.9");
strcat(pRequestProxyHeader,"\r\n");

strcat(pRequestProxyHeader,"\r\n");

int Length=strlen(pRequestProxyHeader);

if(send(m_s,pRequestProxyHeader,Length,0)==-1)
{
printf("send error\n");
return false;
}
printf("send proxy request ok\n");

//验证代理是否成功


nLength=recv(m_s,pBuffer,1048,0);
printf("%ld",nLength);
if (!nLength)
{ printf("%l\n",nLength);
printf("revf error \n");
return false;
}
else
{
if (strnicmp(pBuffer,"HTTP/1.1 200",strlen("HTTP/1.1 200"))||strnicmp(pBuffer,"HTTP/1.0 200",strlen("HTTP/1.0 200")))
{
FILE *stream;
if ((stream = fopen("Auth_proxy.html", "w+")) == NULL)
{
printf("can not open file");
}
fwrite(pBuffer, strlen(pBuffer), 1, stream);
printf("have writed strlen(pData) = %d\n",strlen(pBuffer));
printf("proxy success \n");
//printf(pBuffer);
return true;
}
else
{
printf("proxy fail \n");
return false;

}
}

return true;
}

相关主题