18,356
社区成员
发帖
与我相关
我的任务
分享
代理端:
#include "StdAfx.h"
#include "ProxyS.h"
#include <process.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
CProxyS* pThis=NULL;
CProxyS::CProxyS(void)
{
WSADATA wasData;
WSAStartup(MAKEWORD(2,2),&wasData);
this->m_pWndView = NULL;
this->socketManager=SOCKET_ERROR;
pThis=this;
}
CProxyS::~CProxyS(void)
{
WSACleanup();
}
VOID CProxyS::OnPostNotif(TCHAR* szNotif)
{
//通知些显示消息
if(this->m_pWndView != NULL)
{
this->m_pWndView->SendMessage(NOTIF_MSG_SHOW, (WPARAM)szNotif);
}
}
BOOL CProxyS::OnStartServerListen(UINT nPort) //启动服务器线程
{
HANDLE hServer = (HANDLE)_beginthreadex( NULL,
NULL,
this->ServerListenProc,
(LPVOID)nPort,
NULL,
NULL
);
if(NULL==hServer)
{
return FALSE;
}
return TRUE;
}
unsigned WINAPI CProxyS::ServerListenProc(LPVOID lpVoid)
{
SOCKET ProxyServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(SOCKET_ERROR==ProxyServer)
{
pThis->OnPostNotif(_T("Server socket init error!"));
return 1;
}
struct sockaddr_in srvaddr;
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons((UINT)lpVoid);
srvaddr.sin_addr.S_un.S_addr=INADDR_ANY;
if(bind(ProxyServer,(LPSOCKADDR)&srvaddr,sizeof(SOCKADDR))==SOCKET_ERROR)
{
pThis->OnPostNotif(_T("Server socket bind error!"));
return 1;
}
if(listen(ProxyServer,DEFLISNUM)==SOCKET_ERROR)
{
pThis->OnPostNotif(_T("Server socket listen error!"));
return 1;
}
pThis->OnPostNotif(_T("监听成功"));
sockaddr_in addrRemote;
int len=sizeof(sockaddr);
while(1)
{
SOCKET acceptSocket=accept(ProxyServer,(sockaddr*)&addrRemote,&len);
if(SOCKET_ERROR==acceptSocket)
{
break;
}
CHAR *sIP=inet_ntoa(addrRemote.sin_addr); //得到客户端IP
pThis->OnPostNotif(_T("收到一个IE连接,IP:"));
pThis->ServerReceive(acceptSocket);
}
return 0;
}
VOID CProxyS::ServerReceive(SOCKET ServerSocket)
{
char bufferdata[MAXBUFSIZE];
memset(bufferdata,0,MAXBUFSIZE);
//接收客户端发来的请求
int nRecvLen = recv(ServerSocket,bufferdata,MAXBUFSIZE, 0);
if(nRecvLen==0)
{
closesocket(ServerSocket);
return;
}
// 向WebServer提交请求
SOCKADDR_IN saServer;
SOCKET hsocket;
int nRet;
hsocket = socket(AF_INET,SOCK_STREAM,0);
if(hsocket==INVALID_SOCKET)
{
//printf("Failed socket(),error code:%d\n",WSAGetLastError());
return;
}
saServer.sin_family = AF_INET;
saServer.sin_port = htons(8080);
saServer.sin_addr.S_un.S_addr=inet_addr(bufferdata);//= *((LPIN_ADDR)*lphostent->h_addr_list);
CHAR *wIP=inet_ntoa(saServer.sin_addr);
nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));
if(nRet==SOCKET_ERROR)
{
closesocket(hsocket);
return;
}
// 向webserver转发IE请求
nRet = TCPsend(hsocket,bufferdata,strlen(bufferdata),0);
char dest[MAXBUFSIZE];
memset(dest,0,MAXBUFSIZE);
nRet=TCPrecv(hsocket,dest,MAXBUFSIZE,0); //断点测试出错,总返回1
int e=WSAGetLastError(); //e=10053
nRet=1;
int senlen=0;
while(nRet>0)
{
memset(dest,0,1000);
nRet=recv(hsocket,dest,sizeof(dest)-1,0); // 从webserver获取数据
if(nRet==0)
{
break;
}
else if(nRet==SOCKET_ERROR )
{
break;
}
dest[nRet]='\0';
//将数据转发给客户端
senlen = TCPsend(ServerSocket,dest,nRet,0);
if(senlen==0)
{
sockaddr_in sin;
int len = sizeof(sin);
if(getpeername(ServerSocket,(sockaddr*)&sin,&len)== SOCKET_ERROR)
{
//break;
}
// break;
}
else if(senlen==SOCKET_ERROR)
{
//break;
}
}
closesocket(ServerSocket);
closesocket(hsocket);
}
int CProxyS::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==SOCKET_ERROR)//网络出现异常
{
break;
}
length-=n;
sendCount+=n;
}
return sendCount; // 返回已发送的字节数
}
int CProxyS::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==SOCKET_ERROR)//网络出现异常
{
printf("Failed recv(),error code:%d\n",WSAGetLastError());
break;
}
length-=nRev;
recvCount+=nRev;
}
return recvCount; //返回接收到的字节数
}