如何对网站做进一步优化,wordpress评论主题,甘肃省建设厅查询网站,重庆网站制作公司初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github#xff1a;codetoys#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C的#xff0c;可以在任何平台上使用。 早期上网经常需要使用代理服务…初级代码游戏的专栏介绍与文章目录-CSDN博客
我的githubcodetoys所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C的可以在任何平台上使用。 早期上网经常需要使用代理服务器现在用的比较少了大家更耳熟能详的反而是“反向代理”如Nginx。 代理服务器一般用作局域网上网而反向代理则是把来自互联网的连接转发到局域网上作用刚好相反。 HTTP协议自身就带有对代理服务器的支持。HTTP协议目前主要有多个版本0.9太简单基本不见了1.0只支持一个连接一个请求1.1则支持长连接2.0极大复杂化了传输过程支持多路复用。协议版本这么多但是代理服务器作为中间商可以选择一个较低的版本用户的客户端和服务器一般都有能力适应多个版本。 代理服务器可以选择比较简单的HTTP1.0版本一个连接就是一个请求只需要在连接建立之后做处理处理完请求就是简单的数据转发了。
目录 HTTP1.0协议对代理服务器的支持基本就是两点 代理服务器要做的事情是 代理服务器认证 隧道请求CONNECT 代码示例 HTTP1.0协议对代理服务器的支持基本就是两点
请求行对使用绝对URL专用于代理服务器的Proxy-XXXX头标 代理服务器要做的事情是
取出请求行的服务器域名和端口并擦除擦除后与直接请求的请求行相同将协议版本降低为自己支持的版本根据proxy-XXXX头标处理并擦除像直接请求一样访问服务器转发数据给用户 前面说的“擦除”是把后面的数据前移而不是设置为空格设置为空格并不符合HTTP协议服务器一般不能理解。 原则上代理服务器可以支持客户端和服务器是不同的协议版本比如客户端是1.0而服务器是1.1这将极大地影响程序复杂度。 虽然HTTP的BODY与代理服务器处理无关只需要接受完头部就可以处理但是最好整个请求完整发送因为有些服务器不能处理请求头和BODY分开的情形。 代理服务器认证 代理服务器通过Proxy-XXXX头标进行认证这个认证是代理服务器的认证而不是用户要访问的服务器的认证。代理服务器认证完后就应该删除这些头标因为这些头标对目标服务器毫无意义。 隧道请求CONNECT CONNECT是个不常用的头标专门用于代理。代理服务器取得目标服务器后直接连上去就可以了然后就是双向转发数据。 代码示例 下面的代码就是一个HTTP1.0代理的协议处理部分的代码没有认证因为用的是IP地址认证在进入这个代码之前就已经处理过了
//servicethreadhttp.cpp#include stdafx.h
#include mystd.h
#include Proxy.h
#include httpresp.hextern CProxyApp theApp;//HTTP协议处理线程
DWORD ServiceThreadHttp(LPDWORD lpdwParam)
{
//--线程参数处理------------------------int cdindex;//连接数据索引struct ServiceData * servicedata;cdindex((struct ThreadUserData *)lpdwParam)-index;servicedata((struct ThreadUserData *)lpdwParam)-servicedata;
//--------------------------------------struct ConnectionData * cd;struct LogStruct * logs;cdservicedata-connectiondataarray.pconnectiondata[cdindex];if(-1!cd-log){logsservicedata-memlogfile.logstructcd-log;}else{logsNULL;}
//----------------------------------------struct ConfigInfo * pci;pciservicedata-serviceconfigfiledata.configarray[cd-serviceindex];int headlen;int port;char host[256];char uri[256];unsigned long addr;SOCKADDR_IN sa;BOOL isTunnelFALSE;//是否是隧道请求char tunnelresponse[]HTTP/1.0 200 Connection established\x0d\x0aProxy-agent: FreeProxy 1.0\x0d\x0a\x0d\x0a;//退出if(CONNECTIONDATA_CMD_QUITcd-cmd){closesocket(cd-sdc.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-1;}//接收请求cd-sdc.bufcountRecvHttpRequest(cd-sdc.s,cd-sdc.buf,BUFFERSIZE,cd-cmd,headlen,pci-islimitpost,1000*pci-maxpost);if(0cd-sdc.bufcount){//DebugMessage(RecvHttpRequest失败);closesocket(cd-sdc.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-1;}//分析请求
/* char tracertfile[256];if(-1!mymemindex(cd-sdc.buf,cd-sdc.bufcount,says%2Fnick,strlen(says%2Fnick))){strcpy(tracertfile,tracert_);itoa(cdindex,tracertfilestrlen(tracertfile),10);if(-1!cd-log)WriteTracertFile(tracertfile,logs-username,strlen(logs-username));WriteTracertFile(tracertfile,cd-sdc.buf,cd-sdc.bufcount);}*/if(0GetHttpURL(cd-sdc.buf,cd-sdc.bufcount,headlen4,host,256,port,uri,256)){if(pci-isenableconnect 0GetTunnelURL(cd-sdc.buf,cd-sdc.bufcount,headlen4,host,256,port,uri,256)){//是隧道请求isTunnelTRUE;if(-1!cd-log){strcpy(logs-domainname,host);}}else{send(cd-sdc.s,httpresp400,strlen(httpresp400),0);closesocket(cd-sdc.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-2;}}else{if(-1!cd-log){strcpy(logs-domainname,host);}}ClearProxyInfo(cd-sdc.buf,cd-sdc.bufcount);//检查目标许可if(IsForbidden(theApp.bandata,host,uri)){send(cd-sdc.s,httpresp403,strlen(httpresp403),0);closesocket(cd-sdc.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-1;}//退出if(CONNECTIONDATA_CMD_QUITcd-cmd){closesocket(cd-sdc.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-1;}//记录日志计时开始if(-1!cd-log){time(logs-timestart);}//域名解析if(1!GetAddrByHost(addr,host)){send(cd-sdc.s,httpresp600,strlen(httpresp600),0);closesocket(cd-sdc.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-3;}memcpy((sa.sin_addr.S_un.S_addr),addr,4);sa.sin_familyAF_INET;sa.sin_porthtons((unsigned short)port);//建立SOCKETif(INVALID_SOCKET(cd-sdr.ssocket(AF_INET,SOCK_STREAM,0))){send(cd-sdc.s,httpresp601,strlen(httpresp601),0);closesocket(cd-sdc.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-4;}//退出if(CONNECTIONDATA_CMD_QUITcd-cmd){closesocket(cd-sdc.s);closesocket(cd-sdr.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-1;}//连接if(SOCKET_ERRORconnect(cd-sdr.s,(struct sockaddr *)sa,sizeof(sa))){send(cd-sdc.s,httpresp602,strlen(httpresp602),0);closesocket(cd-sdc.s);closesocket(cd-sdr.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-5;}else{if(-1!cd-log){strcpy(logs-domainname,uri);}}//退出if(CONNECTIONDATA_CMD_QUITcd-cmd){closesocket(cd-sdc.s);closesocket(cd-sdr.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-1;}//发送请求if(isTunnel){if(SOCKET_ERRORsend(cd-sdc.s,tunnelresponse,strlen(tunnelresponse),0)){send(cd-sdc.s,httpresp603,strlen(httpresp603),0);closesocket(cd-sdc.s);closesocket(cd-sdr.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-6;}}if(SOCKET_ERRORsend(cd-sdr.s,cd-sdc.buf,cd-sdc.bufcount,0)){send(cd-sdc.s,httpresp603,strlen(httpresp603),0);closesocket(cd-sdc.s);closesocket(cd-sdr.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-6;}//记录字节数if(-1!cd-log){logs-bytecountcd-sdc.bufcount;}///TraceData(servicedata-isDataTrace,servicedata-memlogfile.logdatatrace[cd-log].dc,cd-sdc.buf,cd-sdc.bufcount);//退出if(CONNECTIONDATA_CMD_QUITcd-cmd){closesocket(cd-sdc.s);closesocket(cd-sdr.s);if(-1!cd-log){logs-stateLOGSTRUCT_STATE_NOUSE;}cd-stateCONNECTION_NOUSE;return (DWORD)-1;}//接收数据并发给客户TransData(cd-sdr.s,cd-sdc.s,cd-sdr.buf,BUFFERSIZE,cd-cmd,cd-sdr.bufcount,servicedata,cd);//记录字节数if(-1!cd-log){logs-bytecountcd-sdr.bufcount;}closesocket(cd-sdc.s);closesocket(cd-sdr.s);if(-1!cd-log){time(logs-timeend);logs-stateLOGSTRUCT_STATE_USED;}cd-stateCONNECTION_NOUSE;return 1;
}//接收HTTP请求如果出错不执行closesocket()
int RecvHttpRequest(SOCKET s,char * buf,int buflen,int * cmd,int* headlen,BOOL islimitpost,int maxpost)
{maxpost1;const char CRLF[]\x0d\x0a;const char CRLFCRLF[]\x0d\x0a\x0d\x0a;const char CONTENTLENGTH[]Content-Length:;int recvcount0;int temp;int recvall0;BOOL tempbool;struct timeval timeout;timeout.tv_sec0;timeout.tv_usec100000;for(;1;){//退出if(CONNECTIONDATA_CMD_QUIT*cmd){return -1;}if(1!IsSocketReadReady(s,timeout,tempbool)){return -2;}if(tempbool){recvcountrecv(s,bufrecvall,buflen-recvall,0);}else{continue;}if(SOCKET_ERRORrecvcount){return -3;}else if(0recvcount){return -4;}recvallrecvcount;//在使用后面代码段时使用CRLFCRLF,4否则使用CRLF,2tempmymemindex(buf,recvall,(char*)CRLFCRLF,4);if(-1!temp){*headlentemp;break;}}if(islimitpost -1!(tempmymemindex(buf,*headlen,(char*)CONTENTLENGTH,15))){long i;char len[10];if(-1(imymemindex(buftemp,buflen-temp,(char*)CRLF,2))){return -5;}i-strlen(CONTENTLENGTH);if(i9){return -6;}memcpy(len,buftempstrlen(CONTENTLENGTH),i);len[i]\0;iatoi(len);if(imaxpost){return -7;}}return recvall;
}//取得URL
int GetHttpURL(char* buf,int * buflenall,int buflen,char * host,int hostbuflen,int * port,char * uri,int uribuflen)
{const char CRLF[]\x0d\x0a;int urlstart,urlend;int hoststart,hostend,hostlen;int portstart,portend,portlen;int pos;char str[10];urlendmymemindex(buf,buflen,(char*)CRLF,2);if(-1(urlstartmymemindex(buf,urlend,http://,7))){return -2; }if(urlend-urlstarturibuflen){memcpy(uri,bufurlstart,uribuflen-1);uri[uribuflen-1]\0;}else{memcpy(uri,bufurlstart,urlend-urlstart);uri[urlend-urlstart]\0;}//得到主机名起始位置hoststarturlstart7;if(-1(posmymemindex(bufhoststart,urlend-hoststart,/,1))){return -3;}portendposhoststart;posmymemindex(bufhoststart,portend-hoststart,:,1);if(-1!pos)//有端口{portstartposhoststart1;//得到端口起始位置hostendposhoststart;portlenportend-portstart;memcpy(str,bufportstart,portlen);str[portlen]\0;if(0portlen) *port80;//若端口长度为零实际上无端口{if(0(*portatoi(str)))return -4;}}else//无端口{*port80;hostendportend;}hostlenhostend-hoststart;if(hostlenhostbuflen)return -5;memcpy(host,bufhoststart,hostlen);host[hostlen]\0;//HTTP请求处理long i;//降版本1.1为1.0if(1buf[urlend-1]){buf[urlend-1]0;}//擦去URLiportend-urlstart;memmove(bufurlstart,bufportend,*buflenall-portend);*buflenall-i;return hostlen;
}//取得隧道请求
int GetTunnelURL(char* buf,int * buflenall,int buflen,char * host,int hostbuflen,int * port,char * uri,int uribuflen)
{const char CRLF[]\x0d\x0a;int urlstart,urlend;int hoststart,hostend,hostlen;int portstart,portend,portlen;int pos;char str[10];urlendmymemindex(buf,buflen,(char*)CRLF,2);if(buflen8 || 0!memcmp(buf,CONNECT,7))return -2;if( !buf[7])return -2;for(urlstart8;urlstartbuflen;urlstart){if( !buf[urlstart])break;}if(urlenduribuflen){memcpy(uri,buf,uribuflen-1);uri[uribuflen-1]\0;}else{memcpy(uri,buf,urlend);uri[urlend]\0;}//得到主机名起始位置hoststarturlstart;if(-1(posmymemindex(bufhoststart,urlend-hoststart,/,1))){return -3;}portendposhoststart;posmymemindex(bufhoststart,portend-hoststart,:,1);if(-1!pos)//有端口{portstartposhoststart1;//得到端口起始位置hostendposhoststart;portlenportend-portstart;memcpy(str,bufportstart,portlen);str[portlen]\0;if(0portlen) *port80;//若端口长度为零实际上无端口{if(0(*portatoi(str)))return -4;}}else//无端口{*port80;hostendportend;}hostlenhostend-hoststart;if(hostlenhostbuflen)return -5;memcpy(host,bufhoststart,hostlen);host[hostlen]\0;//HTTP请求处理*buflenall0;return hostlen;
}//清除代理信息
int ClearProxyInfo(char * buf,int * buflenall)
{const char PROXYCONNECTION[]Proxy-Connection;const char CRLF[]\x0d\x0a;int i,j;if(2(imymemindex(buf,*buflenall,PROXYCONNECTION,strlen(PROXYCONNECTION))))return 1;//前面至少应有一个CRLFif(0!memcmp(bufi-2,CRLF,2))return 1;if(-1(jmymemindex(bufistrlen(PROXYCONNECTION),(*buflenall)-i-strlen(PROXYCONNECTION),CRLF,2))){j(*buflenall)-i-strlen(PROXYCONNECTION);}//擦去代理信息memmove(bufi-2,bufistrlen(PROXYCONNECTION)j,(*buflenall)-(istrlen(PROXYCONNECTION)j));*buflenall-2strlen(PROXYCONNECTION)j;return 1;
} 主要就是这么几件事取出目标地址和端口擦除目标信息降低版本为1.0擦除Proxy-XXXX头标连接目标双向转发数据。 这个代码是从实际项目中截取出来的。 这里是结束 文章转载自: http://www.morning.qlck.cn.gov.cn.qlck.cn http://www.morning.yfpnl.cn.gov.cn.yfpnl.cn http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.qwpdl.cn.gov.cn.qwpdl.cn http://www.morning.grbgn.cn.gov.cn.grbgn.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn http://www.morning.xcdph.cn.gov.cn.xcdph.cn http://www.morning.rcjyc.cn.gov.cn.rcjyc.cn http://www.morning.bntfy.cn.gov.cn.bntfy.cn http://www.morning.kxrld.cn.gov.cn.kxrld.cn http://www.morning.mmosan.com.gov.cn.mmosan.com http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.kngqd.cn.gov.cn.kngqd.cn http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn http://www.morning.tsqrc.cn.gov.cn.tsqrc.cn http://www.morning.dzgmj.cn.gov.cn.dzgmj.cn http://www.morning.xkhxl.cn.gov.cn.xkhxl.cn http://www.morning.jhswp.cn.gov.cn.jhswp.cn http://www.morning.pqcrz.cn.gov.cn.pqcrz.cn http://www.morning.hjwzpt.com.gov.cn.hjwzpt.com http://www.morning.rfhm.cn.gov.cn.rfhm.cn http://www.morning.kpbgp.cn.gov.cn.kpbgp.cn http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn http://www.morning.bsghk.cn.gov.cn.bsghk.cn http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn http://www.morning.yppln.cn.gov.cn.yppln.cn http://www.morning.zsrjn.cn.gov.cn.zsrjn.cn http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn http://www.morning.lfttb.cn.gov.cn.lfttb.cn http://www.morning.tpnch.cn.gov.cn.tpnch.cn http://www.morning.lpyjq.cn.gov.cn.lpyjq.cn http://www.morning.ltbwq.cn.gov.cn.ltbwq.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.rcdmp.cn.gov.cn.rcdmp.cn http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.pngdc.cn.gov.cn.pngdc.cn http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.080203.cn.gov.cn.080203.cn http://www.morning.wfkbk.cn.gov.cn.wfkbk.cn http://www.morning.juju8.cn.gov.cn.juju8.cn http://www.morning.snyqb.cn.gov.cn.snyqb.cn http://www.morning.fglth.cn.gov.cn.fglth.cn http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn http://www.morning.qfcnp.cn.gov.cn.qfcnp.cn http://www.morning.khdw.cn.gov.cn.khdw.cn http://www.morning.ljsxg.cn.gov.cn.ljsxg.cn http://www.morning.knwry.cn.gov.cn.knwry.cn http://www.morning.c7627.cn.gov.cn.c7627.cn http://www.morning.nmtyx.cn.gov.cn.nmtyx.cn http://www.morning.zcckq.cn.gov.cn.zcckq.cn http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.msfqt.cn.gov.cn.msfqt.cn http://www.morning.nxfuke.com.gov.cn.nxfuke.com http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn http://www.morning.pgzgy.cn.gov.cn.pgzgy.cn http://www.morning.txkrc.cn.gov.cn.txkrc.cn http://www.morning.pmnn.cn.gov.cn.pmnn.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.xbtlt.cn.gov.cn.xbtlt.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.mzgq.cn.gov.cn.mzgq.cn http://www.morning.tbbxn.cn.gov.cn.tbbxn.cn http://www.morning.yccnj.cn.gov.cn.yccnj.cn http://www.morning.tldhq.cn.gov.cn.tldhq.cn http://www.morning.flfdm.cn.gov.cn.flfdm.cn http://www.morning.wjyyg.cn.gov.cn.wjyyg.cn http://www.morning.ltqzq.cn.gov.cn.ltqzq.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.jrwbl.cn.gov.cn.jrwbl.cn http://www.morning.rzczl.cn.gov.cn.rzczl.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.kjfqf.cn.gov.cn.kjfqf.cn http://www.morning.trhrk.cn.gov.cn.trhrk.cn http://www.morning.ztrht.cn.gov.cn.ztrht.cn http://www.morning.jycr.cn.gov.cn.jycr.cn http://www.morning.gpmrj.cn.gov.cn.gpmrj.cn http://www.morning.lrnfn.cn.gov.cn.lrnfn.cn