如何判斷主機網卡mac及撥接的mac |
答題得分者是:RaynorPao
|
csm825050
一般會員 發表:49 回覆:29 積分:15 註冊:2003-08-20 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請教各位: 我是用撥接的方式上網的 這時如果處理封包都會有兩組mac 例如我上一個網站會有兩組封包都有記錄我上哪個網站 我想要記錄本身的就好了 所以要將撥接的mac剃除 1.可是該如何判斷這兩種mac呢? 2.另外我用gethostbyname會得到兩組ip,再透過ip也會取得2組mac,請問有方 法察出本身網卡的資訊嗎?csm825050 你好: 可以利用 IP Helper API 來達成目的 你要關心的 > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
csm825050
一般會員 發表:49 回覆:29 積分:15 註冊:2003-08-20 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: RaynorPao你好: PMIB_IFTABLE mibtbl; unsigned long tblsize; GetIfTable( mibtbl , &tblsize , TRUE ); 可是好像怪怪的 mibtbl->table->dwType讀出來的值有問題 mibtbl->table->wszName是? 請教一下這問題在哪呢 不知道你有沒有範例可以記給我呢 謝謝csm825050 你好: 我寫了一個簡單的範例,先參考看看吧 < class="code"> #include "Iphlpapi.h" void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString szTemp; Memo1->Clear(); DWORD dwSize=0; MIB_IFTABLE *mit=NULL; GetIfTable(NULL, &dwSize, true); mit=(MIB_IFTABLE*)new BYTE[dwSize]; if(NO_ERROR==GetIfTable(mit, &dwSize, true)) { for(int i=0; i<(int)mit->dwNumEntries; i ) { if(mit->table[i].dwType==MIB_IF_TYPE_ETHERNET) { Memo1->Lines->Add("Adapter: " (AnsiString)(char*)mit->table[i].bDescr); Memo1->Lines->Add("dwType: " IntToStr(mit->table[i].dwType)); Memo1->Lines->Add("dwPhysAddrLen: " IntToStr(mit->table[i].dwPhysAddrLen)); szTemp=""; for(int j=0; j<(int)mit->table[i].dwPhysAddrLen; j ) { szTemp =(IntToHex(mit->table[i].bPhysAddr[j], 2) " "); } Memo1->Lines->Add("bPhysAddr: " szTemp); } } } delete mit; } 備註: 還要利用 Project Manager 把以下的檔案 Add 到你的 Project 裡面 C:\Program Files\Borland\CBuilder6\Lib\Psdk\iphlpapi.lib -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
csm825050
一般會員 發表:49 回覆:29 積分:15 註冊:2003-08-20 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: RaynorPao你好 問題解決了 GetIfTable(NULL, &dwSize, true); mit=(MIB_IFTABLE*)new BYTE[dwSize]; if(NO_ERROR==GetIfTable(mit, &dwSize, true)) 原來是這三行的問題 想請問一下如何知道要這樣寫呢 我以為只要if(NO_ERROR==GetIfTable(mit, &dwSize, true)) 這樣就可以了耶(因為msdn沒看到範例) csm825050 你好: (1)這是 Win32 API 的慣例,當傳回的參數是一筆很大的資料的時候 (BLOB: Binary Large OBject,就是某個串流 Stream,利用一個 BYTE* 及 一個 DWORD 來表示這個串流的長度),就必須先為這個指標配置一塊合理的記憶體 這樣 Win32 API 才能夠把傳回的串流放到這塊記憶體裡面 (2)但是~~我們要怎麼樣才能夠知道要先為這個指標配置一塊多大的記憶體呢?? 其實很簡單,以 GetIfTable 這個 function 為例,第一次 call 這個 function 的時候,就故意把第一個參數代入 NULL,第二個參數代入 DWORD* ,這個時候 Win32 API 就會知道你是來問 Size 的,就會把需要的 Size 放 到第二個參數,然後你再依照傳回的 Size 為第一個參數配置記憶體 (以 BYTE 為單位),最後再 call 一次 GetIfTable 就可以成功了 (3)如果你覺得這樣做很麻煩的話 (call 兩次),其實也有另外一個變通的方法 ,那就是用預估的方式,也就是說自己先為第一個參數配置一塊記憶體 (用 預估的方式,例如: 4096 BYTE),然後直接 call GetIfTable 一次應該也可 以成功達到目的,不過~~這需要一點運氣 (要保證傳回的串流大小不會超過 4096 BYTE,不然就會造成 Access Violation) (4)以上這兩種方法都是常用的方法,也都各有優缺點,使用 (2) 的方法,可以 很精確的配置記憶體,不會造成浪費,但是要 call 兩次,有點麻煩;使用 (3) 的方法,只需要 call 一次,比較快,但是則需要一點運氣,可能有點 不太保險 (5)以後你看到這方面類似的 Win32 API,應該就要會使用了-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
csm825050
一般會員 發表:49 回覆:29 積分:15 註冊:2003-08-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |