IP Helper API - 获取 TCP/IP/UDP 统计信息、接口详细信息、ARP 表和路由表






3.13/5 (5投票s)
2002年3月1日
2分钟阅读

135372

4900
获取 TCP/IP/UDP 统计信息、接口详细信息、ARP 表和路由表。
引言
有一些文章描述了如何检索关于网络的统计信息。我们过去常常手动加载 inetmib1.dll 并映射函数指针,以便获得所有需要的信息。
最后,微软发布了一些不错的 API 来执行这些操作。本文解释了如何使用这些发布的 API。 这些 API 分为以下几类
接口类
这个类允许应用程序检索网络适配器的特性信息。Windows NT 4.0 Service Pack 4 的 IP Helper API 如下所示
GetIfTable
: 检索所有网络适配器的物理特性。GetIfEntry
: 检索特定适配器的特性。SetIfEntry
: 更新特定适配器的操作状态,例如描述接口是启动、关闭还是处于测试模式。SetIpTTL
: 允许应用程序修改从你的系统发送的所有 IP 数据包的生存时间 (TTL) 字段。
IP 地址类
这个类允许应用程序修改和检索 IP 配置信息。然而,大多数这些 API 在 Windows NT 4.0 Service Pack 4 上不受支持。 Windows NT 4.0 SP 4 的 IP Helper API 如下所示
GetIpAddrTable
: 允许应用程序检索 IP 地址信息。
ARP 表类
这个类通过从 IP 地址映射到物理地址来提供对地址解析协议 (ARP) 条目的访问。 Windows NT 4.0 Service Pack 4 的 IP Helper API 如下所示
GetIpNetTable
: 检索地址解析表信息。SetIpNetEntry
: 向 ARP 表添加条目。DeleteIpNetEntry
: 从 ARP 表删除条目。
路由表类
这个类允许应用程序检索 IP 路由信息,并允许应用程序修改表中的路由条目。 路由是从路由表中选择下一个跃点地址,数据包通过该地址发送。 Windows NT 4.0 Service Pack 4 的 IP Helper API 如下所示
GetIpForwardTable
: 检索路由表信息。SetIpForwardEntry
: 添加路由表条目。DeleteIpForwardEntry
: 删除路由表条目。GetRTTAndHopCount
: 提供到特定 IP 目标的近似往返时间信息,并提供到该目标的跃点计数。
统计信息类
这个类提供关于本地计算机上各种数据包/连接统计信息的信息。 Windows NT 4.0 Service Pack 4 的 IP Helper API 如下所示
GetIpStatistics
: 检索互联网协议 (IP) 数据包统计信息。GetIcmpStatistics
: 检索互联网控制消息协议 (ICMP) 统计信息。GetTcpStatistics
: 检索传输控制协议 (TCP) 统计信息。GetUdpStatistics
: 检索用户数据报协议 (UDP) 统计信息。
源代码和演示应用程序
我使用 Visual Studio .NET 将这个演示放在一起
// View.cpp : implementation of the CWinNetStatView class // #include "stdafx.h" #include "WinNetStat.h" #include "WinNetStatDoc.h" #include "WinNetStatView.h" #include "netstatmanager.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CWinNetStatView IMPLEMENT_DYNCREATE(CWinNetStatView, CFormView) BEGIN_MESSAGE_MAP(CWinNetStatView, CFormView) ON_BN_CLICKED(IDC_TCPSTATS, OnClickedTcpstats) ON_BN_CLICKED(IDC_UDPTATS, OnBnClickedUdptats) ON_BN_CLICKED(IDC_IPSTATS, OnBnClickedIpstats) ON_BN_CLICKED(IDC_NW_PARAMS, OnBnClickedNwParams) ON_BN_CLICKED(IDC_ADAPTER_INFO, OnBnClickedAdapterInfo) END_MESSAGE_MAP() // CWinNetStatView construction/destruction CWinNetStatView::CWinNetStatView() : CFormView(CWinNetStatView::IDD) { // TODO: add construction code here } CWinNetStatView::~CWinNetStatView() { } void CWinNetStatView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_TEXT_OUTPUT, m_TextOutput); } BOOL CWinNetStatView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CFormView::PreCreateWindow(cs); } void CWinNetStatView::OnInitialUpdate(){ CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } // CWinNetStatView diagnostics #ifdef _DEBUG void CWinNetStatView::AssertValid() const { CFormView::AssertValid(); } void CWinNetStatView::Dump(CDumpContext& dc) const{ CFormView::Dump(dc); } CWinNetStatDoc* CWinNetStatView::GetDocument() const { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinNetStatDoc))); return (CWinNetStatDoc*)m_pDocument; } #endif //_DEBUG// CWinNetStatView message handlers void CWinNetStatView::OnClickedTcpstats() { MIB_TCPSTATS TcpStatsMIB; ::GetTcpStatistics(&TcpStatsMIB); CString strMsg; CString strOutPut; strOutPut.Format("\r\n************************************\r\n"); strMsg.Format("\tTCP/IP Statistics\t\r\n"); strOutPut+=strMsg; strMsg.Format("\r\n************************************\r\n"); strOutPut+=strMsg; strMsg.Format("time-out algorithm:\t%d\r\n", TcpStatsMIB.dwRtoAlgorithm); strOutPut+=strMsg; strMsg.Format("minimum time-out:\t%d\r\n", TcpStatsMIB.dwRtoMin); strOutPut+=strMsg; strMsg.Format("maximum time-out:\t%d\r\n", TcpStatsMIB.dwRtoMax); strOutPut+=strMsg; strMsg.Format("maximum connections:\t%d\r\n", TcpStatsMIB.dwMaxConn); strOutPut+=strMsg; strMsg.Format("active opens:\t%d\r\n", TcpStatsMIB.dwActiveOpens); strOutPut+=strMsg; strMsg.Format("passive opens:\t%d\r\n", TcpStatsMIB.dwPassiveOpens); strOutPut+=strMsg; strMsg.Format("failed attempts:\t%d\r\n", TcpStatsMIB.dwAttemptFails); strOutPut+=strMsg; strMsg.Format("established connections reset:\t%d\r\n", TcpStatsMIB.dwEstabResets); strOutPut+=strMsg; strMsg.Format("established connections:\t%d\r\n", TcpStatsMIB.dwCurrEstab); strOutPut+=strMsg; strMsg.Format("segments received:\t%d\r\n",TcpStatsMIB.dwInSegs); strOutPut+=strMsg; strMsg.Format("segment sent:\t%d\r\n",TcpStatsMIB.dwOutSegs); strOutPut+=strMsg; strMsg.Format("segments retransmitted:\t%d\r\n", TcpStatsMIB.dwRetransSegs); strOutPut+=strMsg; strMsg.Format("incoming errors:\t%d\r\n",TcpStatsMIB.dwInErrs); strOutPut+=strMsg; strMsg.Format("outgoing resets:\t%d\r\n",TcpStatsMIB.dwOutRsts); strOutPut+=strMsg; strMsg.Format("cumulative connections:\t%d\r\n", TcpStatsMIB.dwNumConns); strOutPut+=strMsg; m_TextOutput.SetWindowText(strOutPut); } void CWinNetStatView::OnBnClickedUdptats(){ MIB_UDPSTATS UDPStatsMIB; ::GetUdpStatistics(&UDPStatsMIB); CString strMsg; CString strOutPut; strOutPut.Format("\r\n************************************\r\n"); strMsg.Format("\tUDP Statistics\t\r\n"); strOutPut+=strMsg; strMsg.Format("\r\n************************************\r\n"); strOutPut+=strMsg; strMsg.Format("received datagrams:\t%d\r\n",UDPStatsMIB.dwInDatagrams); strOutPut+=strMsg; strMsg.Format("datagrams for which no port exists:\t%d\r\n" ,UDPStatsMIB.dwNoPorts); strOutPut+=strMsg; strMsg.Format("errors on received datagrams:\t%d\r\n", UDPStatsMIB.dwInErrors); strOutPut+=strMsg; strMsg.Format("sent datagrams:\t%d\r\n",UDPStatsMIB.dwOutDatagrams); strOutPut+=strMsg; strMsg.Format("number of entries in UDP listener table:\t%d\r\n", UDPStatsMIB.dwNumAddrs); strOutPut+=strMsg; m_TextOutput.SetWindowText(strOutPut); } void CWinNetStatView::OnBnClickedIpstats(){ MIB_IPSTATS IPStatsMIB; ::GetIpStatistics(&IPStatsMIB); CString strMsg; CString strOutPut; strOutPut.Format("\r\n************************************\r\n"); strMsg.Format("\tIP Statistics\t\r\n"); strOutPut+=strMsg; strMsg.Format("\r\n************************************\r\n"); strOutPut+=strMsg; strMsg.Format("IP forwarding enabled or disabled:\t%d\r\n", IPStatsMIB.dwForwarding); strOutPut+=strMsg; strMsg.Format("default time-to-live:\t%d\r\n", IPStatsMIB.dwDefaultTTL); strOutPut+=strMsg; strMsg.Format("datagrams received:\t%d\r\n", IPStatsMIB.dwInReceives); strOutPut+=strMsg; strMsg.Format("received header errors:\t%d\r\n", IPStatsMIB.dwInHdrErrors); strOutPut+=strMsg; strMsg.Format("received address errors:\t%d\r\n", IPStatsMIB.dwInAddrErrors); strOutPut+=strMsg; strMsg.Format("datagrams forwarded:\t%d\r\n", IPStatsMIB.dwForwDatagrams); strOutPut+=strMsg; strMsg.Format("datagrams with unknown protocol:\t%d\r\n", IPStatsMIB.dwInUnknownProtos); strOutPut+=strMsg; strMsg.Format("received datagrams discarded:\t%d\r\n", IPStatsMIB.dwInDiscards); strOutPut+=strMsg; strMsg.Format("received datagrams delivered:\t%d\r\n", IPStatsMIB.dwInDelivers); strOutPut+=strMsg; strMsg.Format("sent datagrams discarded:\t%d\r\n", IPStatsMIB.dwOutDiscards); strOutPut+=strMsg; strMsg.Format("datagrams for which no route exists:\t%d\r\n", IPStatsMIB.dwOutNoRoutes); strOutPut+=strMsg; strMsg.Format("datagrams for which all frags did not arrive:\t%d\r\n", IPStatsMIB.dwReasmTimeout); strOutPut+=strMsg; strMsg.Format("datagrams requiring reassembly:\t%d\r\n", IPStatsMIB.dwReasmReqds); strOutPut+=strMsg; strMsg.Format("successful reassemblies:\t%d\r\n",IPStatsMIB.dwReasmOks); strOutPut+=strMsg; strMsg.Format("failed reassemblies:\t%d\r\n",IPStatsMIB.dwReasmFails); strOutPut+=strMsg; strMsg.Format("successful fragmentations:\t%d\r\n",IPStatsMIB.dwFragOks); strOutPut+=strMsg; strMsg.Format("failed fragmentations:\t%d\r\n",IPStatsMIB.dwFragFails); strOutPut+=strMsg; strMsg.Format("datagrams fragmented:\t%d\r\n",IPStatsMIB.dwFragCreates); strOutPut+=strMsg; strMsg.Format("number of interfaces on computer:\t%d\r\n", IPStatsMIB.dwNumIf); strOutPut+=strMsg; strMsg.Format("number of IP address on computer:\t%d\r\n", IPStatsMIB.dwNumAddr); strOutPut+=strMsg; strMsg.Format("number of routes in routing table:\t%d\r\n", IPStatsMIB.dwNumRoutes); strOutPut+=strMsg; m_TextOutput.SetWindowText(strOutPut); } void CWinNetStatView::OnBnClickedNwParams(){ FIXED_INFO * FixedInfo; ULONG ulOutBufLen; DWORD dwRetVal; IP_ADDR_STRING * pIPAddr; CString strMsg; CString strOutPut; strOutPut.Format("\r\n************************************\r\n"); strMsg.Format("\tNetwork Parameters\t\r\n"); strOutPut+=strMsg; strMsg.Format("\r\n************************************\r\n"); strOutPut+=strMsg; FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) ); ulOutBufLen = sizeof( FIXED_INFO ); if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen )) { GlobalFree( FixedInfo ); FixedInfo =(FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen ); } if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) ) { strMsg.Format( "Call to GetNetworkParams failed. Return Value: %08x\r\n", dwRetVal ); strOutPut+=strMsg; } else { strMsg.Format( "Host Name: %s\r\n", FixedInfo -> HostName ); strOutPut+=strMsg; strMsg.Format( "Domain Name: %s\r\n", FixedInfo -> DomainName ); strOutPut+=strMsg; strMsg.Format( "DNS Servers:\r\n" ); strOutPut+=strMsg; strMsg.Format( "\t%s\r\n", FixedInfo -> DnsServerList.IpAddress.String ); strOutPut+=strMsg; pIPAddr = FixedInfo -> DnsServerList.Next; while ( pIPAddr ) { strMsg.Format( "\t%s\r\n", pIPAddr ->IpAddress.String ); strOutPut+=strMsg; pIPAddr = pIPAddr ->Next; } } m_TextOutput.SetWindowText(strOutPut); } void CWinNetStatView::OnBnClickedAdapterInfo(){ IP_ADAPTER_INFO * FixedInfo; ULONG ulOutBufLen; DWORD dwRetVal; IP_ADDR_STRING * pIPAddr; CString strMsg; CString strOutPut; strOutPut.Format("\r\n************************************\r\n"); strMsg.Format("\t Adaptor Information\t\r\n"); strOutPut+=strMsg; strMsg.Format("\r\n************************************\r\n"); strOutPut+=strMsg; FixedInfo = (IP_ADAPTER_INFO *) GlobalAlloc( GPTR, sizeof( IP_ADAPTER_INFO ) ); ulOutBufLen = sizeof( IP_ADAPTER_INFO ); if( ERROR_BUFFER_OVERFLOW == GetAdaptersInfo(FixedInfo,&ulOutBufLen)) { GlobalFree( FixedInfo ); FixedInfo =(IP_ADAPTER_INFO *) GlobalAlloc( GPTR, ulOutBufLen ); } if ( dwRetVal = GetAdaptersInfo( FixedInfo, &ulOutBufLen ) ) { strMsg.Format( "Call to GetAdaptersInfo failed. Return Value: %08x\r\n", dwRetVal ); strOutPut+=strMsg; } else { strMsg.Format( "AdapterName: %s\r\n",FixedInfo->AdapterName ); strOutPut+=strMsg; strMsg.Format( "Description: %s\r\n",FixedInfo->Description ); strOutPut+=strMsg; } m_TextOutput.SetWindowText(strOutPut); }