📄 routedlg.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 + -