⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 routedlg.cpp

📁 最近在调试PPC上的VPN程序
💻 CPP
字号:
/******************************************************/
// 项目: 路由维护工具
// 文件: RouteDlg.cpp
// 作者: 李闽东
// 创建日期: 2007-06-28
// 修改记录:
/******************************************************/

#include "stdafx.h"

#include "Route.h"
#include "RouteDlg.h"

#include "EditDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "Iphlpapi.h"
#pragma comment(lib, "Iphlpapi.lib")

cRouteHelper::cRouteHelper() : m_pAdpTab(NULL), m_pFrwTab(NULL)
{
}

cRouteHelper::~cRouteHelper()
{
	if(m_pAdpTab != NULL) free(m_pAdpTab);
	if(m_pFrwTab != NULL) free(m_pFrwTab);
}

BOOL cRouteHelper::UpdateAdapter()
{
	if(m_pAdpTab != NULL)
	{
		free(m_pAdpTab);
		m_pAdpTab = NULL;
	}

	ULONG size = 0;
	DWORD err;
	err = GetAdaptersInfo(NULL, &size);
	if(err == ERROR_NO_DATA)
		return TRUE;

	if(err != ERROR_BUFFER_OVERFLOW)
		return FALSE;

	m_pAdpTab = (PIP_ADAPTER_INFO)malloc(size);
	err = GetAdaptersInfo(m_pAdpTab, &size);
	if(err != NO_ERROR)
	{
		free(m_pAdpTab);
		m_pAdpTab = NULL;
		return FALSE;
	}

	return TRUE;
}

BOOL cRouteHelper::GetAdapterIP(const DWORD dwIndex, in_addr& addr)
{
	if(m_pAdpTab == NULL || dwIndex == (DWORD)~0)
	{
		addr.S_un.S_addr = 0;
		return FALSE;
	}

	const IP_ADAPTER_INFO *adapter;
	for (adapter = m_pAdpTab; adapter != NULL; adapter = adapter->Next)
	{
		if (adapter->Index == dwIndex)
			break;
	}

	if(adapter == NULL)
	{
		addr.S_un.S_addr = 0;
		return FALSE;
	}

	addr.S_un.S_addr = inet_addr(adapter->IpAddressList.IpAddress.String);
	return TRUE;
}

BOOL cRouteHelper::UpdateForwardTable()
{
	if(m_pFrwTab != NULL)
	{
		free(m_pFrwTab);
		m_pFrwTab = NULL;
	}

	ULONG size = 0;
	DWORD err;

	err = GetIpForwardTable (NULL, &size, TRUE);
	if(err != ERROR_INSUFFICIENT_BUFFER)
		return FALSE;

	m_pFrwTab = (PMIB_IPFORWARDTABLE)malloc(size);
	if(GetIpForwardTable(m_pFrwTab, &size, TRUE) != NO_ERROR)
	{
		free(m_pFrwTab);
		m_pFrwTab = NULL;
		return FALSE;
	}

	return TRUE;
}

BOOL cRouteHelper::AddRoute(MIB_IPFORWARDROW &entry)
{
	DWORD dwError;

    dwError = CreateIpForwardEntry(&entry);
    if(dwError == NO_ERROR)
		return TRUE;

	entry.dwForwardType = 3;
	dwError = CreateIpForwardEntry (&entry);
	if(dwError == NO_ERROR)
		return TRUE;

	return FALSE;
}

BOOL cRouteHelper::DelRoute(MIB_IPFORWARDROW &entry)
{
	return (DeleteIpForwardEntry(&entry) == NO_ERROR);
}

BOOL cRouteHelper::SetRoute(MIB_IPFORWARDROW &entry)
{
	return (SetIpForwardEntry(&entry) == NO_ERROR);
}

/////////////////////////////////////////////////////////////////////////////
// CRouteDlg dialog

CRouteDlg::CRouteDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CRouteDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRouteDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CRouteDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRouteDlg)
	DDX_Control(pDX, IDC_LV_ROUTE, m_lvRoute);
	DDX_Control(pDX, IDC_LV_ADAPTER, m_lvAdapter);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CRouteDlg, CDialog)
	//{{AFX_MSG_MAP(CRouteDlg)
	ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
	ON_COMMAND(IDM_OP_ADD, OnAddRoute)
	ON_COMMAND(IDM_OP_DEL, OnDelRoute)
	ON_COMMAND(IDM_OP_EDIT, OnEditRoute)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRouteDlg message handlers

BOOL CRouteDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	
	m_lvAdapter.ModifyStyle(0, LVS_REPORT, 0);
	m_lvAdapter.SetExtendedStyle(LVS_EX_FULLROWSELECT);
	
	m_lvAdapter.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 60);
	m_lvAdapter.InsertColumn(1, _T("名称"), LVCFMT_LEFT, 110);
	m_lvAdapter.InsertColumn(2, _T("地址"), LVCFMT_LEFT, 110);
	m_lvAdapter.InsertColumn(3, _T("掩码"), LVCFMT_LEFT, 110);
	m_lvAdapter.InsertColumn(4, _T("网关"), LVCFMT_LEFT, 110);

	m_lvRoute.ModifyStyle(0, LVS_REPORT, 0);
	m_lvRoute.SetExtendedStyle(LVS_EX_FULLROWSELECT);
	
	m_lvRoute.InsertColumn(0, _T("目标地址"), LVCFMT_LEFT, 110);
	m_lvRoute.InsertColumn(1, _T("子网掩码"), LVCFMT_LEFT, 110);
	m_lvRoute.InsertColumn(2, _T("网关"), LVCFMT_LEFT, 110);
	m_lvRoute.InsertColumn(3, _T("接口"), LVCFMT_LEFT, 110);
	m_lvRoute.InsertColumn(4, _T("跃点"), LVCFMT_LEFT, 30);

	UpdateRoute();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CRouteDlg::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
	CPoint point(lParam);
	CRect rect;
	m_lvRoute.GetWindowRect(&rect);
	if(rect.PtInRect(point))
	{
		CMenu mnPopup;
		CMenu* pmnSubMenu;

		mnPopup.LoadMenu(IDR_MENU_POPUP);
		pmnSubMenu = mnPopup.GetSubMenu(0);

		pmnSubMenu->TrackPopupMenu(TPM_LEFTALIGN,
			point.x, point.y, this);	
	}
}

BOOL CRouteDlg::UpdateRoute()
{
	m_lvAdapter.DeleteAllItems();
	m_lvRoute.DeleteAllItems();

	if(!m_sRouteHelper.UpdateAdapter())
		return FALSE;

	int nIndex = 0;
	const IP_ADAPTER_INFO *adapter;
	for (adapter = m_sRouteHelper.m_pAdpTab; adapter != NULL; adapter = adapter->Next)
	{
		InsertAdapter(nIndex++, adapter);
	}

	if(!m_sRouteHelper.UpdateForwardTable())
		return FALSE;

	for(int i = 0; i < (int)m_sRouteHelper.m_pFrwTab->dwNumEntries; i++)
	{
		InsertFrwRow(i, m_sRouteHelper.m_pFrwTab->table[i]);
	}

	return TRUE;
}

BOOL CRouteDlg::InsertFrwRow(int nIndex, const MIB_IPFORWARDROW &sFrwRow)
{
	nIndex = m_lvRoute.InsertItem(nIndex, _T(""));
	
	CString szSubItem;
	in_addr addr;

	USES_CONVERSION;
	addr.S_un.S_addr = sFrwRow.dwForwardDest;
	m_lvRoute.SetItemText(nIndex, 0, A2T(inet_ntoa(addr)));
	addr.S_un.S_addr = sFrwRow.dwForwardMask;
	m_lvRoute.SetItemText(nIndex, 1, A2T(inet_ntoa(addr)));
	addr.S_un.S_addr = sFrwRow.dwForwardNextHop;
	m_lvRoute.SetItemText(nIndex, 2, A2T(inet_ntoa(addr)));

	//m_sRouteHelper.GetAdapterIP(sFrwRow.dwForwardIfIndex, addr);
	//m_lvRoute.SetItemText(nIndex, 3, A2T(inet_ntoa(addr)));

	szSubItem.Format(_T("0x%X"), sFrwRow.dwForwardIfIndex);
	m_lvRoute.SetItemText(nIndex, 3, szSubItem);

	szSubItem.Format(_T("%d"), sFrwRow.dwForwardMetric1);
	m_lvRoute.SetItemText(nIndex, 4, szSubItem);

	return TRUE;
}

BOOL CRouteDlg::InsertAdapter(int nIndex, const IP_ADAPTER_INFO *sAdapter)
{
	nIndex = m_lvAdapter.InsertItem(nIndex, _T(""));
	
	CString szSubItem;
	szSubItem.Format(_T("0x%X"), sAdapter->Index);
	m_lvAdapter.SetItemText(nIndex, 0, szSubItem);

	USES_CONVERSION;
	m_lvAdapter.SetItemText(nIndex, 1, A2T(sAdapter->AdapterName));

	m_lvAdapter.SetItemText(nIndex, 2, A2T(sAdapter->IpAddressList.IpAddress.String));
	m_lvAdapter.SetItemText(nIndex, 3, A2T(sAdapter->IpAddressList.IpMask.String));
	m_lvAdapter.SetItemText(nIndex, 4, A2T(sAdapter->GatewayList.IpAddress.String));
	m_lvAdapter.SetItemData(nIndex, sAdapter->Index);

	return TRUE;
}

void CRouteDlg::OnAddRoute() 
{
	MIB_IPFORWARDROW entry;
	memset(&entry, 0, sizeof(entry));

	entry.dwForwardDest = 0;
	entry.dwForwardMask = 0;
	entry.dwForwardPolicy = 0;
	entry.dwForwardNextHop = 0;
	entry.dwForwardIfIndex = 0;
	entry.dwForwardType = 4;  /* the next hop is not the final dest */
	entry.dwForwardProto = 3; /* PROTO_IP_NETMGMT */
	entry.dwForwardAge = 0;
	entry.dwForwardNextHopAS = 0;
	entry.dwForwardMetric1 = 0;
	entry.dwForwardMetric2 = ~0;
	entry.dwForwardMetric3 = ~0;
	entry.dwForwardMetric4 = ~0;
	entry.dwForwardMetric5 = ~0;

	int nIndex = m_lvAdapter.GetSelectionMark();
	if(nIndex >= 0)
	{
		entry.dwForwardIfIndex = m_lvAdapter.GetItemData(nIndex); 
	}
	
	CEditDlg dlg(this, entry);

	if(dlg.DoModal() == IDOK)
	{
		if(m_sRouteHelper.AddRoute(entry))
		{
			UpdateRoute();
			MessageBox(_T("增加路由成功!"), _T("提示"), MB_OK | MB_ICONINFORMATION);
		}
		else
		{
			MessageBox(_T("增加路由失败!"), _T("错误"), MB_OK | MB_ICONERROR);
		}
	}
}

void CRouteDlg::OnDelRoute() 
{
	int nItem = m_lvRoute.GetSelectionMark();
	if(nItem < 0)
	{
		MessageBox(_T("请先选中要删除的记录"), _T("提示"), MB_OK | MB_ICONINFORMATION);
		return;
	}

	USES_CONVERSION;

	DWORD dwForwardDest = inet_addr(T2A(m_lvRoute.GetItemText(nItem, 0)));
	for(int i = 0; i < (int)m_sRouteHelper.m_pFrwTab->dwNumEntries; i++)
	{
		if(dwForwardDest == m_sRouteHelper.m_pFrwTab->table[i].dwForwardDest)
		{
			if(m_sRouteHelper.DelRoute(m_sRouteHelper.m_pFrwTab->table[i]))
			{
				MessageBox(_T("删除路由成功!"), _T("提示"), MB_OK | MB_ICONINFORMATION);
				UpdateRoute();
			}
			else
			{
				MessageBox(_T("删除路由失败!"), _T("错误"), MB_OK | MB_ICONERROR);
			}

			return;
		}
	}
}

void CRouteDlg::OnEditRoute() 
{
	int nItem = m_lvRoute.GetSelectionMark();
	if(nItem < 0)
	{
		MessageBox(_T("请先选中要修改的记录"), _T("提示"), MB_OK | MB_ICONINFORMATION);
		return;
	}

	USES_CONVERSION;

	MIB_IPFORWARDROW entry;
	memset(&entry, 0, sizeof(entry));

	entry.dwForwardDest = inet_addr(T2A(m_lvRoute.GetItemText(nItem, 0)));
	for(int i = 0; i < (int)m_sRouteHelper.m_pFrwTab->dwNumEntries; i++)
	{
		if(entry.dwForwardDest == m_sRouteHelper.m_pFrwTab->table[i].dwForwardDest)
		{
			memcpy(&entry, &m_sRouteHelper.m_pFrwTab->table[i], sizeof(MIB_IPFORWARDROW));

			CEditDlg dlg(this, entry);
			if(dlg.DoModal() == IDOK)
			{
				if(m_sRouteHelper.SetRoute(entry))
				{
					UpdateRoute();
					MessageBox(_T("修改路由成功!"), _T("提示"), MB_OK | MB_ICONINFORMATION);
				}
				else
				{
					MessageBox(_T("修改路由失败!"), _T("错误"), MB_OK | MB_ICONERROR);
				}
			}

			return;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -