www.pudn.com > ProxyService.rar > ProxyServiceDlg.cpp
// ProxyServiceDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ProxyService.h"
#include "ProxyServiceDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_ACCEPT_MESSAGE WM_USER + 1
#define WM_READCLOSE_MESSAGE WM_USER + 2
char szReadBuffer[8192]; // 数据缓存
/////////////////////////////////////////////////////////////////////////////
// CProxyServiceDlg dialog
CProxyServiceDlg::CProxyServiceDlg(CWnd* pParent /*=NULL*/)
: CDialog(CProxyServiceDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CProxyServiceDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CProxyServiceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CProxyServiceDlg)
DDX_Control(pDX, IDC_LIST_LOG, m_ctlLog);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProxyServiceDlg, CDialog)
//{{AFX_MSG_MAP(CProxyServiceDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CTLCOLOR()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ACCEPT_MESSAGE, OnAcceptMessage)
ON_MESSAGE(WM_READCLOSE_MESSAGE, OnReadCloseMessage)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProxyServiceDlg message handlers
BOOL CProxyServiceDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// 初始化winsock
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
// ProxyService.Ini
char szProxyServiceIni[MAX_PATH];
ZeroMemory(szProxyServiceIni, sizeof(szProxyServiceIni));
GetCurrentDirectory(sizeof(szProxyServiceIni), szProxyServiceIni);
strcat(szProxyServiceIni, "\\ProxyService.ini");
// 得到代理个数
char szFieldValue[30];
ZeroMemory(szFieldValue, sizeof(szFieldValue));
if(GetPrivateProfileString("Config", "ProxyCount", "0", szFieldValue, sizeof(szFieldValue), szProxyServiceIni))
{
int iProxyCount = atoi(szFieldValue);
for(int iProxy = 0; iProxy < iProxyCount; iProxy++)
{
// 创建新代理
CNode *ProxyNode = new CNode();
ProxyNode->Prvs = NULL;
ProxyNode->Next = NULL;
// 得到代理设置
char szFieldName[30];
sprintf(szFieldName, "InputPort_%d\0", iProxy);
ZeroMemory(szFieldValue, sizeof(szFieldValue));
GetPrivateProfileString("Config", szFieldName, "0", szFieldValue, sizeof(szFieldValue), szProxyServiceIni);
ProxyNode->Data.InPort = atoi(szFieldValue);
sprintf(szFieldName, "OutputIp_%d\0", iProxy);
ZeroMemory(szFieldValue, sizeof(szFieldValue));
GetPrivateProfileString("Config", szFieldName, "", szFieldValue, sizeof(szFieldValue), szProxyServiceIni);
ZeroMemory(ProxyNode->Data.szOutIp, sizeof(ProxyNode->Data.szOutIp));
strcpy(ProxyNode->Data.szOutIp, szFieldValue);
sprintf(szFieldName, "OutputPort_%d\0", iProxy);
ZeroMemory(szFieldValue, sizeof(szFieldValue));
GetPrivateProfileString("Config", szFieldName, "0", szFieldValue, sizeof(szFieldValue), szProxyServiceIni);
ProxyNode->Data.OutPort = atoi(szFieldValue);
// 启动代理端口消息监听
// 提示
char szPrompt[100];
// 创建socket
ProxyNode->Data.sServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == ProxyNode->Data.sServerSocket)
{
// 提示
sprintf(szPrompt, "端口%d创建socket失败!\0", ProxyNode->Data.InPort);
m_ctlLog.AddString(szPrompt);
// 释放资源
delete ProxyNode;
// 继续
continue;
}
// socket地址端口
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(ProxyNode->Data.InPort);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定socket
if(SOCKET_ERROR == bind(ProxyNode->Data.sServerSocket, (const struct sockaddr *)&sin, sizeof(sin)))
{
// 关闭socket
closesocket(ProxyNode->Data.sServerSocket);
ProxyNode->Data.sServerSocket = NULL;
// 提示
sprintf(szPrompt, "端口%d绑定socket失败!\0", ProxyNode->Data.InPort);
m_ctlLog.AddString(szPrompt);
// 释放资源
delete ProxyNode;
// 继续
continue;
}
// 消息映射
if(SOCKET_ERROR == WSAAsyncSelect(ProxyNode->Data.sServerSocket, this->GetSafeHwnd(), WM_ACCEPT_MESSAGE, FD_ACCEPT))
{
// 关闭socket
closesocket(ProxyNode->Data.sServerSocket);
ProxyNode->Data.sServerSocket = NULL;
// 提示
sprintf(szPrompt, "端口%d消息映射失败!\0", ProxyNode->Data.InPort);
m_ctlLog.AddString(szPrompt);
// 释放资源
delete ProxyNode;
// 继续
continue;
}
// 在该socket监听
if(SOCKET_ERROR == listen(ProxyNode->Data.sServerSocket, 5))
{
// 关闭socket
closesocket(ProxyNode->Data.sServerSocket);
ProxyNode->Data.sServerSocket = NULL;
// 提示
sprintf(szPrompt, "端口%d消息监听失败!\0", ProxyNode->Data.InPort);
m_ctlLog.AddString(szPrompt);
// 释放资源
delete ProxyNode;
// 继续
continue;
}
// 添加到链表
m_Proxys.MoveToEnd();
m_Proxys.Insert(ProxyNode);
}
}
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CProxyServiceDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CProxyServiceDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
HBRUSH CProxyServiceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(CTLCOLOR_LISTBOX == nCtlColor)
{
hbr = (HBRUSH)::GetStockObject(NULL_BRUSH);
pDC->SetBkColor(RGB(100, 100, 100));
pDC->SetTextColor(RGB(0, 255, 0));
}
return hbr;
}
LRESULT CProxyServiceDlg::OnAcceptMessage(WPARAM wParam, LPARAM lParam)
{
if(!WSAGETSELECTERROR(lParam) && FD_ACCEPT == WSAGETSELECTEVENT(lParam))
{
// 确定socket
m_Proxys.MoveToBgn();
do
{
CNode *ProxyNode = m_Proxys.GetNode();
if((SOCKET)wParam == ProxyNode->Data.sServerSocket)
{
// 创建连接
CNode *ConnectNode = new CNode();
ConnectNode->Prvs = NULL;
ConnectNode->Next = NULL;
// 接受传入的连接
ConnectNode->Data.sInSocket = accept(ProxyNode->Data.sServerSocket, NULL, NULL);
if(INVALID_SOCKET == ConnectNode->Data.sInSocket)
{
// 释放资源
delete ConnectNode;
// 退出
break;
}
// 连接被代理服务器
// 创建socket
ConnectNode->Data.sOutSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == ConnectNode->Data.sOutSocket)
{
// 关闭socket
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
ConnectNode->Data.sInSocket = NULL;
// 释放资源
delete ConnectNode;
// 退出
break;
}
// socket地址端口
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(ProxyNode->Data.OutPort);
sin.sin_addr.S_un.S_addr = inet_addr(ProxyNode->Data.szOutIp);
// 开始连接
if(SOCKET_ERROR == connect(ConnectNode->Data.sOutSocket, (const struct sockaddr *)&sin, sizeof(sin)))
{
// 关闭socket
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
delete ConnectNode;
// 退出
break;
}
// 消息映射
if(SOCKET_ERROR == WSAAsyncSelect(ConnectNode->Data.sInSocket, this->GetSafeHwnd(), WM_READCLOSE_MESSAGE, FD_READ | FD_CLOSE))
{
// 关闭socket
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
delete ConnectNode;
// 退出
break;
}
if(SOCKET_ERROR == WSAAsyncSelect(ConnectNode->Data.sOutSocket, this->GetSafeHwnd(), WM_READCLOSE_MESSAGE, FD_READ | FD_CLOSE))
{
// 关闭socket
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
delete ConnectNode;
// 退出
break;
}
// 添加到链表
m_Connects.MoveToEnd();
m_Connects.Insert(ConnectNode);
// 退出
break;
}
}while(m_Proxys.MoveToNext());
}
return 0L;
}
LRESULT CProxyServiceDlg::OnReadCloseMessage(WPARAM wParam, LPARAM lParam)
{
if(!WSAGETSELECTERROR(lParam))
{
// socket关闭
if(FD_CLOSE == WSAGETSELECTEVENT(lParam))
{
// 确定socket
m_Connects.MoveToBgn();
do
{
CNode *ConnectNode = m_Connects.GetNode();
if((SOCKET)wParam == ConnectNode->Data.sInSocket ||
(SOCKET)wParam == ConnectNode->Data.sOutSocket)
{
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
m_Connects.Remove();
// 退出
break;
}
}while(m_Connects.MoveToNext());
}
// socket读
else if(FD_READ == WSAGETSELECTEVENT(lParam))
{
// 确定socket
m_Connects.MoveToBgn();
do
{
CNode *ConnectNode = m_Connects.GetNode();
if((SOCKET)wParam == ConnectNode->Data.sInSocket)
{
int iRecved = recv(ConnectNode->Data.sInSocket, szReadBuffer, sizeof(szReadBuffer), 0);
if(iRecved <= 0 || SOCKET_ERROR == iRecved)
{
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
m_Connects.Remove();
}
else
{
int iTryTimes = 0;
while(true)
{
int iSended = send(ConnectNode->Data.sOutSocket, szReadBuffer, iRecved, 0);
if(iSended < iRecved || SOCKET_ERROR == iSended)
{
iTryTimes++;
if(iTryTimes < 10)
{
Sleep(100);
continue;
}
else
{
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
m_Connects.Remove();
}
}
// 退出
break;
}
}
// 退出
break;
}
else if((SOCKET)wParam == ConnectNode->Data.sOutSocket)
{
int iRecved = recv(ConnectNode->Data.sOutSocket, szReadBuffer, sizeof(szReadBuffer), 0);
if(iRecved <= 0 || SOCKET_ERROR == iRecved)
{
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
m_Connects.Remove();
}
else
{
int iTryTimes = 0;
while(true)
{
int iSended = send(ConnectNode->Data.sInSocket, szReadBuffer, iRecved, 0);
if(iSended < iRecved || SOCKET_ERROR == iSended)
{
iTryTimes++;
if(iTryTimes < 10)
{
Sleep(100);
continue;
}
else
{
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
ConnectNode->Data.sInSocket = NULL;
ConnectNode->Data.sOutSocket = NULL;
// 释放资源
m_Connects.Remove();
}
}
// 退出
break;
}
}
// 退出
break;
}
}while(m_Connects.MoveToNext());
}
}
return 0L;
}
void CProxyServiceDlg::OnDestroy()
{
// 关闭所有socket
m_Connects.MoveToBgn();
do
{
CNode *ConnectNode = m_Connects.GetNode();
if(NULL != ConnectNode)
{
shutdown(ConnectNode->Data.sInSocket, SD_BOTH);
shutdown(ConnectNode->Data.sOutSocket, SD_BOTH);
closesocket(ConnectNode->Data.sInSocket);
closesocket(ConnectNode->Data.sOutSocket);
}
}while(m_Connects.MoveToNext());
m_Proxys.MoveToBgn();
do
{
CNode *ProxyNode = m_Proxys.GetNode();
if(NULL != ProxyNode)
{
closesocket(ProxyNode->Data.sServerSocket);
}
}while(m_Proxys.MoveToNext());
// 析构winsock
WSACleanup();
CDialog::OnDestroy();
}