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(); 
}