2022年用VC++.编写Proxy服务器 2.pdf

上传人:H****o 文档编号:33393268 上传时间:2022-08-10 格式:PDF 页数:10 大小:57.98KB
返回 下载 相关 举报
2022年用VC++.编写Proxy服务器 2.pdf_第1页
第1页 / 共10页
2022年用VC++.编写Proxy服务器 2.pdf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《2022年用VC++.编写Proxy服务器 2.pdf》由会员分享,可在线阅读,更多相关《2022年用VC++.编写Proxy服务器 2.pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、用 VC+6.0编写 Proxy 服务器我们一般常用的 Internet代理服务器是用微软的Proxy Server 2.0 。但我们可以自己动手编写一个简单、 小型的 Proxy Server 。 下面介绍具体的实现方法。一 原理本程序的结构原理如下:对于每一个用户的请求(Internet 请求,由浏览器发出),本程序将启动两个线程,一个把本地用户的请求数据发送到远程的Internet主机,另一个线程把远程主机的回应数据发送到本地请求用户。二 主要函数UserToProxyThread ( void * pParam ) :它是用来把本地用户请求数据发送到远程主机的,起服务器线程角色。当接到

2、本地(局域网)用户的请求,它就启动另一个自身线程, 以侦听别的用户的请求, 并读出已接收到的请求数据,接着启动第二个线程 ProxyToServer() (这个线程用来连接远程主机),当远程主机连接成功后,它把已读出的本地用户请求数据发送到远程主机。ProxyToServer ( void * pParam) ,可以被当作是客户端服务,它把远程主机发送来的数据分发给本地请求用户。三 开发运行环境本程序是在 VC+6.0环境下开发的,在Win95 和 WinNT4.0 下运行正常。四 详细代码#include stdafx.h #include Proxy.h #include /WINSOCK

3、ET API 2。0 #include #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - #endif / #define HTTP http:/ #define FTP ftp:/ #define PROXYPORT 500

4、1 /Proxy 端口#define BUFSIZE 10240 /缓冲区大小CWinApptheApp; using namespace std; UINT ProxyToServer(LPVOID pParam); UINT UserToProxyThread(void *pParam); structSocketPair SOCKET user_proxy; /socket : 本地机器到 PROXY 服务机SOCKET proxy_server; /socket : PROXY 服务机到远程主机BOOL IsUser_ProxyClosed; / 本地机器到 PROXY 服务机状态BO

5、OL IsProxy_ServerClosed; / PROXY 服务机到远程主机状态; structProxyParam char Address256; / 远程主机地址HANDLE User_SvrOK; / PROXY 服务机到远程主机的联结状态SocketPair *pPair; / 维护一组 SOCKET 的指针int Port; / 用来联结远程主机的端口; /这个结构用来 PROXY SERVER与远程主机的信息交换 . SOCKET gListen_Socket; /用来侦听的 SOCKET。intStartServer() /启动服务 WSADATA wsaData; so

6、ckaddr_in local; SOCKET listen_socket; if(:WSAStartup(0 x202,&wsaData)!=0) printf(nError in Startup session.n);WSACleanup();return -1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - local.sin_family=AF_INET; local.sin_addr.s_addr=INADDR_A

7、NY; local.sin_port=htons(PROXYPORT); listen_socket=socket(AF_INET,SOCK_STREAM,0); if(listen_socket=INVALID_SOCKET) printf(nError in New a Socket.);WSACleanup();return -2; if(:bind(listen_socket,(sockaddr *)&local,sizeof(local)!=0) printf(n Error in Binding socket.); WSACleanup();return -3; ; if(:lis

8、ten(listen_socket,5)!=0) printf(n Error in Listen.); WSACleanup(); return -4; gListen_Socket=listen_socket; AfxBeginThread(UserToProxyThread,NULL); /启动侦听return 1; intCloseServer() /关闭服务 closesocket(gListen_Socket); WSACleanup(); return 1; / 分析接收到的字符,得到远程主机地址intGetAddressAndPort( char * str, char *ad

9、dress, int * port) charbufBUFSIZE, command512, proto128, *p; int j; sscanf(str,%s%s%s,command,buf,proto); p=strstr(buf,HTTP); /HTTP if(p) p+=strlen(HTTP); for(int I=0;Istrlen(p);I+) if( *(p+I)=/) break; *(p+I)=0; strcpy(address,p); p=strstr(str,HTTP); for(int j=0;j GET / HTTP1.1 名师资料总结 - - -精品资料欢迎下载

10、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 10 页 - - - - - - - - - *port=80; /缺省的 http 端口 else /FTP, 不支持 , 下面的代码可以省略 . p=strstr(buf,FTP); if(!p) return 0; p+=strlen(FTP); for(int I=0;Istrlen(p);I+) if( *(p+I)=/) break; /Get The Remote Host *(p+I)=0; for(j=0;jstrlen(p);j+) if(*(

11、p+j)=:) *port=atoi(p+j+1); /Get The Port *(p+j)=0; else *port=21; strcpy(address,p); p=strstr(str,FTP); for(j=0;jm_hThread,20000); /Should check the return value return 0; / 读取远程主机数据,并发往本地客户机UINT ProxyToServer(LPVOID pParam) ProxyParam * pPar=(ProxyParam*)pParam; char BufferBUFSIZE; char *server_nam

12、e= localhost; unsigned short port ; intretval,Len; unsignedintaddr; intsocket_type ; structsockaddr_in server; structhostent *hp; SOCKET conn_socket; socket_type = SOCK_STREAM; server_name = pPar- Address; port = pPar- Port; if (isalpha(server_name0) /* server address is a name */ hp = gethostbyname

13、(server_name); else /* Convert nnn.nnn address to a usable one */ addr = inet_addr(server_name); hp = gethostbyaddr(char *)&addr,4,AF_INET); if (hp = NULL ) fprintf(stderr,Client: Cannot resolve address %s: Error %dn, server_name,WSAGetLastError(); :SetEvent(pPar- User_SvrOK); return 0; / / Copy the

14、 resolved information into the sockaddr_in structure / memset(&server,0,sizeof(server); memcpy(&(server.sin_addr),hp- h_addr,hp- h_length); server.sin_family = hp- h_addrtype; server.sin_port = htons(port); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 10 页 -

15、- - - - - - - - conn_socket = socket(AF_INET,socket_type,0); /* 打开一个 socket */ if (conn_socketpPair- IsProxy_ServerClosed=TRUE; :SetEvent(pPar- User_SvrOK); return -1; #ifdef _DEBUG printf(Client connecting to: %sn,hp- h_name); #endif if (connect(conn_socket,(structsockaddr*)&server,sizeof(server) =

16、 SOCKET_ERROR) fprintf(stderr,connect() failed: %dn,WSAGetLastError(); pPar-pPair- IsProxy_ServerClosed=TRUE; :SetEvent(pPar- User_SvrOK); return -1; pPar-pPair- proxy_server=conn_socket; pPar-pPair- IsProxy_ServerClosed=FALSE; :SetEvent(pPar- User_SvrOK); / cook up a string to send while(!pPar- pPa

17、ir- IsProxy_ServerClosed&!pPar- pPair-IsUser_ProxyClosed) retval = recv(conn_socket,Buffer,sizeof (Buffer),0 ); if (retval = SOCKET_ERROR ) fprintf(stderr,recv() failed: error %dn,WSAGetLastError(); closesocket(conn_socket); pPar-pPair- IsProxy_ServerClosed=TRUE; break; Len=retval; if (retval = 0) p

18、rintf(Server closed connectionn); closesocket(conn_socket); pPar-pPair- IsProxy_ServerClosed=TRUE; break; retval = send(pPar- pPair- user_proxy,Buffer,Len,0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 10 页 - - - - - - - - - if (retval = SOCKET_ERROR) fprin

19、tf(stderr,send() failed: error %dn,WSAGetLastError(); closesocket(pPar- pPair- user_proxy); pPar-pPair- IsUser_ProxyClosed=TRUE; break; #ifdef _DEBUG BufferLen=0; printf(Received %d bytes, data %s from servern,retval,Buffer); #endif if(pPar- pPair- IsProxy_ServerClosed=FALSE) closesocket(pPar- pPair

20、- proxy_server); pPar-pPair- IsProxy_ServerClosed=TRUE; if(pPar- pPair- IsUser_ProxyClosed=FALSE) closesocket(pPar- pPair- user_proxy); pPar-pPair- IsUser_ProxyClosed=TRUE; return 1; int _tmain(intargc, TCHAR* argv, TCHAR* envp) intnRetCode = 0; / 初始化 SOCKET if (!AfxWinInit(:GetModuleHandle(NULL), N

21、ULL, :GetCommandLine(), 0) / 错误处理cerr _T(Fatal Error: MFC initialization failed) endl; nRetCode = 1; else / 主程序开始 . StartServer(); while(1) if(getchar()=q) break; CloseServer(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - returnnRetCode; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁