代理服务器的工作流程就是:把client的访问请求发送到proxy,proxy再把这些数据转到server,然后server对这个请求产生响应数据,发送到proxy,proxy再把这些数据转到client。经过了proxy,那就可以做好多事情了哈,可以自己设置个墙,自己设置访问优先级,统计流量啥的就不说了,反正可以做各种好玩的。因为刚开始做,做个简单的,以后可以慢慢加功能。
proxy的Linux C 语言版如下所示:
#include<stdio.h> #include<poll.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<string.h> #define ADDR "127.0.0.1" #define PORT 8080 #define PORT_APACHE 8088 #define SIZE 1024 int main() { int ret=0; int maxsocket; int apa,ser,cli; char buf[SIZE]={0}; char apabuf[SIZE]={0}; struct pollfd fds[5]={0}; struct sockaddr_in apaaddr,seraddr,cliaddr; socklen_t clilen=sizeof(cliaddr); apaaddr.sin_family=AF_INET; apaaddr.sin_addr.s_addr=inet_addr(ADDR); apaaddr.sin_port=htons(PORT_APACHE); seraddr.sin_family=AF_INET; seraddr.sin_addr.s_addr=inet_addr(ADDR); seraddr.sin_port=htons(PORT); apa=socket(AF_INET,SOCK_STREAM,0); ser=socket(AF_INET,SOCK_STREAM,0); bind(ser,(struct sockaddr*)&seraddr,sizeof(seraddr)); fds[0].fd=ser; fds[0].events=POLLIN; listen(fds[0].fd,5); while(1) { memset(buf,0,SIZE); memset(apabuf,0,SIZE); ret=poll(fds,sizeof(fds)/sizeof(fds[0]),-1); if(ret<0) { printf("poll error\n"); break; } if(fds[0].revents&POLLIN) { cli=accept(fds[0].fd,(struct sockaddr*)&cliaddr,&clilen); recv(cli,buf,SIZE,0); printf("get from %s:%d-- %s\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port),buf); connect(apa,(struct sockaddr*)&apaaddr,sizeof(apaaddr)); send(apa,buf,SIZE,0); recv(apa,apabuf,SIZE,0); send(cli,apabuf,SIZE,0); } } return 0; }
import tornado.web import tornado.ioloop from tornado.options import options,define,parse_command_line define('port',default=8088,help='run this port',type=int) class MainHandler(tornado.web.RequestHandler): def get(self): self.render('./a.html') parse_command_line() app=tornado.web.Application( [ ('/',MainHandler), ], ) app.listen(options.port) tornado.ioloop.IOLoop.instance().start()
这还是我的老本行tornado,非常方便,a.html里面就是一句话,测试用的,如下:
<html> <head> <title>haha</title> </head> <body> This is a message from proxy. </body> </html>
好了,现在看看效果:
python模拟的真服务器运行效果图:
代理服务器运行效果图:
浏览器访问代理服务器效果图:
哈哈,这就做到最基本的代理功能。如果以后还有时间可以再加点东西搞一搞。
转载请注明:转自 http://blog.csdn.net/littlethunder/article/details/8959967