Visual C++ 2017网络编程实战
上QQ阅读APP看书,第一时间看更新

2.8 获取本机上的UDP统计数据

前面有例子获取了本机的TCP协议统计数据,现在我们来获取UDP协议的统计数据。该功能可以通过函数GetUdpStatistics实现,函数声明如下:

    ULONG GetUdpStatistics(  PMIB_UDPSTATS pStats);

其中,参数pStats指向接收本地计算机的UDP统计信息的MIB_UDPTABLE结构的指针,PMIB_UDPSTATS是MIB_UDPTABLE结构的指针类型。如果函数成功,返回值为NO_ERROR;如果函数失败,使用FormatMessage获取返回错误的消息字符串。

结构体MIB_UDPSTATS定义如下:

    typedef struct _MIB_UDPSTATS
    {
       DWORD       dwInDatagrams;             // 接收的数据包数
       DWORD       dwNoPorts;                 //由于指定的端口无效而丢弃的接收的数据包数
       //接收到的错误数据包的数目。此数字不包括dwNoPorts成员包含的值
       DWORD       dwInErrors;
       DWORD       dwOutDatagrams;            // 传输的数据包数
       DWORD       dwNumAddrs;                // UDP侦听器表中的条目数
    } MIB_UDPSTATS,*PMIB_UDPSTATS;

要获取IPv6协议的UDP统计信息,可以使用其扩展函数GetUdpStatisticsEx。

【例2.8】获取本机的UDP协议的统计数据

(1)新建一个对话框工程Demo。

(2)切换到资源视图,在对话框上放一个列表框和一个按钮。其中,列表框的ID是IDC_LIST。双击按钮,为其添加事件响应代码:

    void CDemoDlg::OnTest()
    {
    CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST);
    pListBox->ResetContent();

    MIB_UDPSTATS UDPStats;

    //获得UDP协议统计信息
    if (GetUdpStatistics(&UDPStats) != NO_ERROR)
    {
         return;
    }

    CString strText = _T("");
    strText.Format(_T("received datagrams:%d\t\n"),
         UDPStats.dwInDatagrams);
    pListBox->AddString(strText);
    strText.Format(_T("datagrams for which no port exists:%d\t\n"),
         UDPStats.dwNoPorts);
    pListBox->AddString(strText);
    strText.Format(_T("errors on received datagrams:%d\t\n"),
         UDPStats.dwInErrors);
    pListBox->AddString(strText);
    strText.Format(_T("sent datagrams:%d\t\n"),
         UDPStats.dwOutDatagrams);
    pListBox->AddString(strText);
    strText.Format(_T("number of entries in UDP listener table:%d\t\n"),
         UDPStats.dwNumAddrs);
    pListBox->AddString(strText);
    }

在DemoDlg.cpp开头包含头文件和引用库文件:

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

(3)保存工程并运行,运行结果如图2-12所示。

图2-12