因為原本產品是用usb網卡端口,所以透過winpcap的方式,只要簡單知道網卡不見了(usb被拔掉之後,就會在清單中消失),就可以判定是斷線了。但是RJ-45端口不是這樣子。需要一些方法。我列舉三種方法,其中沒有ping的方法,ping是去偵測遠端設備的狀況,不是針對local PC端某張網卡。
【方法一】利用winpcap的PacketOpenAdapter方法。他需要使用到底層一點的Packet.lib。
#include ".\winpcap\v4_1_2\Packet32.h"
LPADAPTER adapter_ = PacketOpenAdapter(alldevs->name);
PACKET_OID_DATA *linkStateOid_ = new PACKET_OID_DATA;
memset(linkStateOid_, 0, sizeof(PACKET_OID_DATA) + sizeof(unsigned int));
linkStateOid_->Oid = OID_GEN_MEDIA_CONNECT_STATUS;
linkStateOid_->Length = sizeof(unsigned int);
if (PacketRequest(adapter_, 0, linkStateOid_))
{
unsigned int state;
if (linkStateOid_->Length == sizeof(state))
{
memcpy((void*)&state, (void*)linkStateOid_->Data, linkStateOid_->Length);
if (state == 0) //link up
else if (state == 1) //link down
}
}
【方法二】利用Windows WMI 的 Win32_NetworkAdapter class。透過WQL查詢,將結果放至列舉清單,最後再從清單中,取出NetConnectionStatus參數比對結果。
這邊有Microsoft提供的好用C++範例
IWbemServices *pSvc = NULL;
hres = pSvc->ExecQuery( L"WQL", L"SELECT * FROM Win32_NetworkAdapter", WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
IWbemClassObject *pclsObj = NULL;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
hr = pclsObj->Get(L"NetConnectionStatus", 0, &vtProp, 0, 0);// Uint16
//vtProp.uiVal即為結果
if(vtProp.uiVal == 7) // link down
else if(vtProp.uiVal == 2)//link up
//....
}
【方法三】利用GetAdaptersAddresses列舉出PIP_ADAPTER_ADDRESSES,比對OperStatus參數。
PIP_ADAPTER_ADDRESSES pAddresses = new IP_ADAPTER_ADDRESSES;
PIP_ADAPTER_ADDRESSES ptmpAddr;
GetAdaptersAddresses(family, flags, NULL, pAddresses, &BufSize);
ptmpAddr = pAddresses;
while(NULL!=ptmpAddr){
if(ptmpAddr->OperStatus == IfOperStatusUp) //link up
else //link down
ptmpAddr = ptmpAddr->Next;
}
--結構--
整個程式顯得很亂,大概就是分成三種方法個別開個thread,利用#define來區分。每個thread都是持續不斷的去查找選擇到的網卡的link狀態(中間還是有delay 100毫秒)。直到程式關閉。所以看起來就像是一有變化,在0.1秒左右就會知道狀態了。
分別用#define設定的選取方法去查找。不過畫面上好像看不出來三者差異就是了。
--結論--
方法一:最簡單,使用到winpcap查找送收包的,可以直接套用參數。
方法二:很複雜,最多種資訊,可以獲得更詳細的資料。只是每次都要做那麼一大段。
方法三:難易度介於一二之間,只是若還要透過pcap來送收包,那還要透過AdapterName比對出index才不會亂掉。若是單純檢視用,算是最方便的。
--程式執行圖--
AdapterStatus.7z

0 意見:
張貼留言