上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