如何通过网内机器代理上网 有一局域网,上网受限制,领导可上网,一般员工到指定机器上网(前提:用自已的域名与密码在这台机器上登录成功)。本人想做个服务安装到这台可上网的机器上,然后通过它来上网。请各位高手指点一下。或提供些资料。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 XP自带有共享上网功能winrote等代理软件也很多,自己写一个,除非学习用,没必要 用proxy将可上网的机器调设置为代理服务器,其它机器设置为通过该代理服务器上网 自己写个简单的代理服务器端也不麻烦#include <stdio.h>#include <iostream>#include <string>#include <winsock2.h>#include <process.h>#include "SockInit.h"using namespace std;#define MAX_REQUEST_LEN 2048 // IE请求长度CSockInit initSock; // initalize winsockvoid __cdecl ServerThreadProc(void *param);/************************************************ 调试环境:Visual C++6.0 SP6+platform SDK 2003 R2 程序名称:HTTP proxy Server(HttpProxySvr.cpp) 功能 :IE通过设置代理方式上网,IE所有请求均 先发到该代理服务器,代理服务器将请求直 接转发给webserver, 从webserver读取 响应后发回IE Date: 2007/10/12 author: liqisong eamil : [email protected] **************************************************/int main(){ USHORT uPort=9999; // 通信端口 SOCKET sListen = socket(AF_INET,SOCK_STREAM,0); if(sListen == INVALID_SOCKET) { printf("Failed socket(),error code :%d",WSAGetLastError()); return 0; } sockaddr_in sin; sin.sin_addr.S_un.S_addr = INADDR_ANY; sin.sin_family =AF_INET; sin.sin_port = htons(uPort); if(bind(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR) { printf("Failed bind(),error code :%d",WSAGetLastError()); closesocket(sListen); return 0; } int res =listen(sListen,200); sockaddr_in addrRemote; // IE地址信息 int len =sizeof(addrRemote); SOCKET sNew; // 新建立的连接状态套接口 while(true) { sNew = accept(sListen,(sockaddr*)&addrRemote,&len); if(sNew == INVALID_SOCKET) { printf("Failed accept(),error code :%d",WSAGetLastError()); DeleteCriticalSection(&CriticalSection); closesocket(sListen); return 0; } printf("收到一个IE连接(IP:%s)\n",inet_ntoa(addrRemote.sin_addr)); // 创建一个线程处理该连接 (每客户单线程模式...) stParam *pParam = new stParam; pParam->s = sNew; pParam->addr = addrRemote; _beginthread(ServerThreadProc,0,(void*)pParam); } closesocket(sListen); return 0;} void __cdecl ServerThreadProc(void *param){ stParam *pParam = (stParam*)param; SOCKET sock = pParam->s; // 与浏览器连接的套接口 sockaddr_in addrIE = pParam->addr; // 与浏览器连接的套接口地址信息 delete pParam; char request[MAX_REQUEST_LEN]; memset(request,0,MAX_REQUEST_LEN); int res =TCPrecv(sock,request,MAX_REQUEST_LEN,0); // 接收浏览器(客户端)发来的请求 if(res==0) { printf("连接断开\n"); shutdown(sock,SD_RECEIVE); closesocket(sock); return; } else if(res==SOCKET_ERROR) { printf("Failed recv(),error code:%d\n",WSAGetLastError()); shutdown(sock,SD_RECEIVE); closesocket(sock); return; } shutdown(sock,SD_RECEIVE); // printf("header length :%d header: %s\n",res,request);// 打印收到的请求 // 分析请求行(分离出WebServer域名) char szAddrName[1024]={0}; // 域名 char szRequestLine[1024]={0}; // 请求行 string strHeader; // 头部 char *pdest; int pos,count=0; char ch =' '; pdest = strchr(request, ch ); // 寻找空格第一次出现的位置 if( pdest == NULL ) { printf( "Result:\t%c not found,error HTTP request\n" ); closesocket(sock); return; } pos = pdest - request+8; // +8 <==> + strlen("http://")+1; int i =pos; while(request[i]!='/'&&i<res) { szAddrName[i-pos] = request[i]; i++; } szAddrName[i-pos]='\0'; printf("WebServer address: %s\n\n",szAddrName); pos = pdest - request; // 空格第一次出现的位置 pdest = strchr(request,'\n'); // 寻找\n第一次出现的位置 count = pdest - request+1; strncpy(szRequestLine,request,count); // 得到请求行(末尾包含了"\r\n") strHeader=pdest+1; // 得到头部 // 将请求行处理一下(使用相对URI连接WebServer) while(szRequestLine[i]!='/0'&&i<1024) { szRequestLine[++pos] = szRequestLine[i++]; } szRequestLine[++pos]='\0'; strcpy(request,szRequestLine); strcat(request,strHeader.c_str()); // 得到新请求(等于处理过后的请求行+ 头部) // cout<<"New request:"<<request<<endl; // 向WebServer提交请求 SOCKADDR_IN saServer; LPHOSTENT lphostent; SOCKET hsocket; int nRet; // 通过域名获得目标WebServer的IP if(isalpha(szAddrName[0])) /* server address is a name*/ { lphostent = gethostbyname(szAddrName); } else { unsigned long addr = inet_addr(szAddrName); lphostent = gethostbyaddr((const char*)&addr,4,AF_INET); } if(lphostent==NULL) { printf("Cannot resolve address,error code:%d\n",WSAGetLastError()); closesocket(sock); return ; } hsocket = socket(AF_INET,SOCK_STREAM,0); if(hsocket==INVALID_SOCKET) { printf("Failed socket(),error code:%d\n",WSAGetLastError()); closesocket(sock); return ; } saServer.sin_family = AF_INET; saServer.sin_port = htons(80); saServer.sin_addr= *((LPIN_ADDR)*lphostent->h_addr_list); nRet = connect(hsocket,(sockaddr*)&saServer,sizeof(saServer)); if(nRet==SOCKET_ERROR) { printf("Failed connect(),error code:%d\n",WSAGetLastError()); closesocket(sock); closesocket(hsocket); return; } // 向webserver转发IE请求 nRet = TCPsend(hsocket,request,strlen(request),0); char dest[1000]; nRet=1; int senlen=0; memset(dest,0,1000); nRet=recv(hsocket,dest,sizeof(dest)-1,0); // 从webserver获取响应行 if(nRet==0) { printf("与webserver(%s)的连接关闭\n",szAddrName); shutdown(hsocket,SD_RECEIVE); //关闭接收操作 closesocket(sock); closesocket(hsocket); return; } else if(nRet==SOCKET_ERROR) { printf("Failed recv(),error code:%d\n",WSAGetLastError()); shutdown(hsocket,SD_RECEIVE); //关闭接收操作 closesocket(sock); closesocket(hsocket); return; } // 取出响应行,处理之... dest[nRet]='\0'; char szRespondLine[1000]={0}; char *pch; pdest = strchr(dest,'\n'); //'\n'第一 次出现的位置 count = pdest - dest+1; pdest++; //越过'\n' pch = strchr(pdest,'\n'); // '\n'第二次出现的位置 count +=(pch -pdest+1); strncpy(szRespondLine,dest,count); szRespondLine[count]='\0'; cout<<szRespondLine; senlen = TCPsend(sock,dest,nRet,0); //将数据转发给IE浏览器 if(senlen==0) { printf("与浏览器(%s)的一个连接关闭...\n",inet_ntoa(addrIE.sin_addr)); closesocket(sock); closesocket(hsocket); return; } else if(senlen==SOCKET_ERROR) { printf("Failed send(),error code:%d\n",WSAGetLastError()); closesocket(sock); closesocket(hsocket); return; } // 循环接收webserver发来的数据,直至该连接关闭... while(nRet>0) { memset(dest,0,1000); nRet=recv(hsocket,dest,sizeof(dest),0); // 从webserver获取数据 if(nRet==0) { printf("与webserver(%s)的连接关闭\n",szAddrName); shutdown(hsocket,SD_RECEIVE); //关闭接收操作 break; } else if(nRet==SOCKET_ERROR) { printf("Failed recv(),error code:%d\n",WSAGetLastError()); break; } senlen = TCPsend(sock,dest,nRet,0); //将数据转发给IE浏览器 if(senlen==0) { printf("与浏览器(%s)的一个连接关闭...\n",inet_ntoa(addrIE.sin_addr)); break; } else if(senlen==SOCKET_ERROR) { printf("Failed send(),error code:%d\n",WSAGetLastError()); break; } // printf("%s\n",dest); } // end of while(nRet>0) closesocket(sock); closesocket(hsocket);}int TCPsend(SOCKET s,const char *buf,int len,int flags){ int n=0,sendCount=0; int length =len; if(buf==NULL) return 0; while(length>0) { n=send(s,buf+sendCount,length,flags); //发送数据, if(n==0) { break; } if(n==SOCKET_ERROR)//网络出现异常 { printf("Failed send(),error code:%d\n",WSAGetLastError()); break; } length-=n; sendCount+=n; } return sendCount; // 返回已发送的字节数}int TCPrecv(SOCKET s,char *buf,int len,int flags){ int nRev=0,recvCount=0; int length =len; if(buf==NULL) return 0; // 循环接收数据 while(length>0) { nRev =recv(s,buf+recvCount,length,flags); if(nRev==0) { break; } if(nRev==SOCKET_ERROR)//网络出现异常 { printf("Failed recv(),error code:%d\n",WSAGetLastError()); break; } length-=nRev; recvCount+=nRev; } return recvCount; //返回接收到的字节数} 还能说什么呢ding 吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ http有三种模式,GET,POST,CONNECT,上面的代码顶多就是只支持GET模式,想登陆邮箱或论坛什么的基本不可能.装个ccproxy上去,HTTP代理,socks代理啥都有了. Calendar控件外单击后,怎么隐藏Caledar控件? cab包的发布 在SDK程序里把窗体设成透明,怎么设? 求救! 本机运行正常,在有的机器上报错:必须的资源无法得到 !!!! CtreeCtl 和CTreeView的区别?? 需要做一个类似VC的能显示彩色文字的编辑框,高手指路? 如何修改gif文件的结构使其能循环播放? vc C/S结构问题 急急急。。。 setwindoworg,setviewportorg的小问题 有关ActiveX控件的两个问题 如何用socket实现多文件传输 有关SMTP认证的问题
winrote等代理软件也很多,自己写一个,除非学习用,没必要
#include <stdio.h>
#include <iostream>
#include <string>
#include <winsock2.h>
#include <process.h>
#include "SockInit.h"
using namespace std;#define MAX_REQUEST_LEN 2048 // IE请求长度
CSockInit initSock; // initalize winsockvoid __cdecl ServerThreadProc(void *param);/************************************************ 调试环境:Visual C++6.0 SP6+platform SDK 2003 R2 程序名称:HTTP proxy Server(HttpProxySvr.cpp) 功能 :IE通过设置代理方式上网,IE所有请求均
先发到该代理服务器,代理服务器将请求直
接转发给webserver, 从webserver读取
响应后发回IE
Date: 2007/10/12
author: liqisong
eamil : [email protected]
**************************************************/int main()
{
USHORT uPort=9999; // 通信端口
SOCKET sListen = socket(AF_INET,SOCK_STREAM,0);
if(sListen == INVALID_SOCKET)
{
printf("Failed socket(),error code :%d",WSAGetLastError());
return 0;
} sockaddr_in sin;
sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_family =AF_INET;
sin.sin_port = htons(uPort);
if(bind(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("Failed bind(),error code :%d",WSAGetLastError());
closesocket(sListen);
return 0;
} int res =listen(sListen,200);
sockaddr_in addrRemote; // IE地址信息
int len =sizeof(addrRemote);
SOCKET sNew; // 新建立的连接状态套接口 while(true)
{
sNew = accept(sListen,(sockaddr*)&addrRemote,&len);
if(sNew == INVALID_SOCKET)
{
printf("Failed accept(),error code :%d",WSAGetLastError());
DeleteCriticalSection(&CriticalSection);
closesocket(sListen);
return 0;
}
printf("收到一个IE连接(IP:%s)\n",inet_ntoa(addrRemote.sin_addr)); // 创建一个线程处理该连接 (每客户单线程模式...)
stParam *pParam = new stParam;
pParam->s = sNew;
pParam->addr = addrRemote;
_beginthread(ServerThreadProc,0,(void*)pParam); } closesocket(sListen); return 0;
}
void __cdecl ServerThreadProc(void *param)
{
stParam *pParam = (stParam*)param; SOCKET sock = pParam->s; // 与浏览器连接的套接口
sockaddr_in addrIE = pParam->addr; // 与浏览器连接的套接口地址信息
delete pParam; char request[MAX_REQUEST_LEN];
memset(request,0,MAX_REQUEST_LEN);
int res =TCPrecv(sock,request,MAX_REQUEST_LEN,0); // 接收浏览器(客户端)发来的请求
if(res==0)
{
printf("连接断开\n");
shutdown(sock,SD_RECEIVE);
closesocket(sock);
return;
}
else if(res==SOCKET_ERROR)
{
printf("Failed recv(),error code:%d\n",WSAGetLastError());
shutdown(sock,SD_RECEIVE);
closesocket(sock);
return;
} shutdown(sock,SD_RECEIVE);
// printf("header length :%d header: %s\n",res,request);// 打印收到的请求 // 分析请求行(分离出WebServer域名)
char szAddrName[1024]={0}; // 域名
char szRequestLine[1024]={0}; // 请求行
string strHeader; // 头部
char *pdest;
int pos,count=0;
char ch =' '; pdest = strchr(request, ch ); // 寻找空格第一次出现的位置
if( pdest == NULL )
{
printf( "Result:\t%c not found,error HTTP request\n" );
closesocket(sock);
return;
}
pos = pdest - request+8; // +8 <==> + strlen("http://")+1;
int i =pos;
while(request[i]!='/'&&i<res)
{
szAddrName[i-pos] = request[i];
i++;
} szAddrName[i-pos]='\0';
printf("WebServer address: %s\n\n",szAddrName);
pos = pdest - request; // 空格第一次出现的位置
pdest = strchr(request,'\n'); // 寻找\n第一次出现的位置
count = pdest - request+1;
strncpy(szRequestLine,request,count); // 得到请求行(末尾包含了"\r\n")
strHeader=pdest+1; // 得到头部
// 将请求行处理一下(使用相对URI连接WebServer)
while(szRequestLine[i]!='/0'&&i<1024)
{
szRequestLine[++pos] = szRequestLine[i++];
}
szRequestLine[++pos]='\0';
strcpy(request,szRequestLine);
strcat(request,strHeader.c_str()); // 得到新请求(等于处理过后的请求行+ 头部)
// cout<<"New request:"<<request<<endl; // 向WebServer提交请求
SOCKADDR_IN saServer;
LPHOSTENT lphostent;
SOCKET hsocket;
int nRet;
// 通过域名获得目标WebServer的IP
if(isalpha(szAddrName[0])) /* server address is a name*/
{
lphostent = gethostbyname(szAddrName);
}
else
{
unsigned long addr = inet_addr(szAddrName);
lphostent = gethostbyaddr((const char*)&addr,4,AF_INET);
}
if(lphostent==NULL)
{
printf("Cannot resolve address,error code:%d\n",WSAGetLastError());
closesocket(sock);
return ;
} hsocket = socket(AF_INET,SOCK_STREAM,0);
if(hsocket==INVALID_SOCKET)
{
printf("Failed socket(),error code:%d\n",WSAGetLastError());
closesocket(sock); return ;
}
saServer.sin_family = AF_INET;
saServer.sin_port = htons(80);
saServer.sin_addr= *((LPIN_ADDR)*lphostent->h_addr_list);
nRet = connect(hsocket,(sockaddr*)&saServer,sizeof(saServer));
if(nRet==SOCKET_ERROR)
{
printf("Failed connect(),error code:%d\n",WSAGetLastError());
closesocket(sock);
closesocket(hsocket);
return;
}
// 向webserver转发IE请求
nRet = TCPsend(hsocket,request,strlen(request),0); char dest[1000];
nRet=1;
int senlen=0; memset(dest,0,1000);
nRet=recv(hsocket,dest,sizeof(dest)-1,0); // 从webserver获取响应行
if(nRet==0)
{
printf("与webserver(%s)的连接关闭\n",szAddrName);
shutdown(hsocket,SD_RECEIVE); //关闭接收操作
closesocket(sock);
closesocket(hsocket);
return;
}
else if(nRet==SOCKET_ERROR)
{
printf("Failed recv(),error code:%d\n",WSAGetLastError());
shutdown(hsocket,SD_RECEIVE); //关闭接收操作
closesocket(sock);
closesocket(hsocket);
return;
} // 取出响应行,处理之...
dest[nRet]='\0';
char szRespondLine[1000]={0};
char *pch;
pdest = strchr(dest,'\n'); //'\n'第一 次出现的位置
count = pdest - dest+1;
pdest++; //越过'\n'
pch = strchr(pdest,'\n'); // '\n'第二次出现的位置
count +=(pch -pdest+1);
strncpy(szRespondLine,dest,count);
szRespondLine[count]='\0';
cout<<szRespondLine; senlen = TCPsend(sock,dest,nRet,0); //将数据转发给IE浏览器
if(senlen==0)
{
printf("与浏览器(%s)的一个连接关闭...\n",inet_ntoa(addrIE.sin_addr));
closesocket(sock);
closesocket(hsocket);
return;
}
else if(senlen==SOCKET_ERROR)
{
printf("Failed send(),error code:%d\n",WSAGetLastError());
closesocket(sock);
closesocket(hsocket);
return;
}
// 循环接收webserver发来的数据,直至该连接关闭...
while(nRet>0)
{
memset(dest,0,1000);
nRet=recv(hsocket,dest,sizeof(dest),0); // 从webserver获取数据
if(nRet==0)
{
printf("与webserver(%s)的连接关闭\n",szAddrName);
shutdown(hsocket,SD_RECEIVE); //关闭接收操作
break;
}
else if(nRet==SOCKET_ERROR)
{
printf("Failed recv(),error code:%d\n",WSAGetLastError());
break;
} senlen = TCPsend(sock,dest,nRet,0); //将数据转发给IE浏览器
if(senlen==0)
{
printf("与浏览器(%s)的一个连接关闭...\n",inet_ntoa(addrIE.sin_addr));
break;
}
else if(senlen==SOCKET_ERROR)
{
printf("Failed send(),error code:%d\n",WSAGetLastError());
break;
} // printf("%s\n",dest); } // end of while(nRet>0)
closesocket(sock);
closesocket(hsocket);
}
int TCPsend(SOCKET s,const char *buf,int len,int flags)
{
int n=0,sendCount=0;
int length =len;
if(buf==NULL)
return 0;
while(length>0)
{
n=send(s,buf+sendCount,length,flags); //发送数据,
if(n==0)
{
break;
}
if(n==SOCKET_ERROR)//网络出现异常
{
printf("Failed send(),error code:%d\n",WSAGetLastError());
break;
}
length-=n;
sendCount+=n;
} return sendCount; // 返回已发送的字节数
}int TCPrecv(SOCKET s,char *buf,int len,int flags)
{
int nRev=0,recvCount=0;
int length =len; if(buf==NULL)
return 0; // 循环接收数据
while(length>0)
{
nRev =recv(s,buf+recvCount,length,flags);
if(nRev==0)
{
break;
}
if(nRev==SOCKET_ERROR)//网络出现异常
{
printf("Failed recv(),error code:%d\n",WSAGetLastError());
break;
}
length-=nRev;
recvCount+=nRev;
} return recvCount; //返回接收到的字节数
}
ding 吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
http有三种模式,GET,POST,CONNECT,上面的代码顶多就是只支持GET模式,想登陆邮箱或论坛什么的基本不可能.装个ccproxy上去,HTTP代理,socks代理啥都有了.