65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.13/5 (5投票s)

2002年3月1日

2分钟阅读

viewsIcon

135372

downloadIcon

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);
}
© . All rights reserved.