利用GetIfTable ,GetIfEntry 实时判断网线插拔状态

该博客介绍了如何利用Windows API函数GetIfTable和GetIfEntry来实时检测网络连接状态,特别是在WIN2000环境下,当网线插拔时,如何通过API获取网络接口的状态信息,包括网线是否连接、网络是否正常工作等。
摘要由CSDN通过智能技术生成

// testlinkDlg.h : header file
//

#if !defined(AFX_TESTLINKDLG_H__C0EDCF96_BB21_4A9D_B508_23DD96954F30__INCLUDED_)
#define AFX_TESTLINKDLG_H__C0EDCF96_BB21_4A9D_B508_23DD96954F30__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/
// CTestlinkDlg dialog
#include "Iphlpapi.h"
#pragma comment(lib,"Iphlpapi")

class CTestlinkDlg : public CDialog
{
// Construction
public:
 CTestlinkDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
 //{ {AFX_DATA(CTestlinkDlg)
 enum { IDD = IDD_TESTLINK_DIALOG };
 CListBox m_List;
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{ {AFX_VIRTUAL(CTestlinkDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 HICON m_hIcon;

 // Generated message map functions
 //{ {AFX_MSG(CTestlinkDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 virtual void OnOK();
 afx_msg void OnTimer(UINT nIDEvent);
 afx_msg void OnButton1();
 afx_msg void OnBtnStop();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()

public:
 void UpdateUI();
 PMIB_IFROW m_pIfRow;
 PMIB_IFTABLE m_pIfTable;
 BOOL GetIfData();
 void tt();
 int m_nNetCnt;
 CString strNetWorkName;
 DWORD m_dwIndex;

};

//{ {AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TESTLINKDLG_H__C0EDCF96_BB21_4A9D_B508_23DD96954F30__INCLUDED_)

 

 

// testlinkDlg.cpp : implementation file
//

#include "stdafx.h"
#include "testlink.h"
#include "testlinkDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define ALLOCATE_FROM_PROCESS_HEAP( bytes )  ::HeapAlloc( ::GetProcessHeap(), HEAP_ZERO_MEMORY, bytes )
#define DEALLOCATE_FROM_PROCESS_HEAP( ptr )  if( ptr ) ::HeapFree( ::GetProcessHeap(), 0, ptr )
#define REALLOC_FROM_PROCESS_HEAP( ptr, bytes ) ::HeapReAlloc( ::GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, bytes )


/
// CAboutDlg dialog used for App About
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

// Dialog Data
 //{ {AFX_DATA(CAboutDlg)
 enum { IDD =

可以使用Windows API中的GetIfTable和GetIfEntry函数来获取本机的网络接口信息,包括接口名称、接口类型、接口状态、接口IP地址等。通过这些信息,可以计算出本机的带宽使用占比。 以下是示例代码: ```c++ #include <iostream> #include <windows.h> #include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib") int main() { MIB_IFTABLE *pIfTable = NULL; DWORD dwSize = 0; // 获取接口表大小 if (GetIfTable(pIfTable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) { pIfTable = (MIB_IFTABLE*)new BYTE[dwSize]; if (GetIfTable(pIfTable, &dwSize, FALSE) != NO_ERROR) { std::cerr << "Failed to get interface table." << std::endl; delete[] pIfTable; return -1; } } // 遍历接口表 for (DWORD i = 0; i < pIfTable->dwNumEntries; i++) { MIB_IFROW &ifRow = pIfTable->table[i]; // 过滤非物理接口 if (ifRow.dwType != IF_TYPE_ETHERNET_CSMACD) continue; // 过滤未连接的接口 if (ifRow.dwOperStatus != IF_OPER_STATUS_OPERATIONAL) continue; // 获取接口的发送和接收字节数 MIB_IF_ROW2 ifRow2 = { 0 }; ifRow2.InterfaceIndex = ifRow.dwIndex; if (GetIfEntry2(&ifRow2) == NO_ERROR) { ULONGLONG bytesSent = ifRow2.OutOctets; ULONGLONG bytesRecv = ifRow2.InOctets; // 计算带宽使用占比 ULONGLONG speed = ifRow2.TransmitLinkSpeed > ifRow2.ReceiveLinkSpeed ? ifRow2.TransmitLinkSpeed : ifRow2.ReceiveLinkSpeed; double usage = (double)(bytesSent + bytesRecv) / (double)speed * 100.0; std::cout << "Interface " << ifRow2.Alias << ": " << usage << "%" << std::endl; } } delete[] pIfTable; return 0; } ``` 该代码通过遍历接口表,找到所有物理接口,并计算出它们的带宽使用占比。其中,使用GetIfEntry2函数获取接口的发送和接收字节数,使用接口的发送和接收速度计算带宽使用占比。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值