方法1:通過getadaptersinfo
#include
<
winsock2.h
>
#include<
iphlpapi.h
>
#include<
stdio.h
>
#pragma comment(lib,"iphlpapi.lib")
int main()
if ((dwretval
= getadaptersinfo
( padapterinfo, &uloutbuflen)) == no_error)
} else }
getadaptersinfo函式是ms提供給程式設計師用來列舉網絡卡資訊api函式,它被封裝在ms sdk中,如果你安裝了mssdk在include 和lib資料夾下,可以找到iphlpapi.h 和對應的iphlpapi.lib。
很遺憾,在vc6下你不的不面對一系列標頭檔案中變數的宣告衝突問題
,我暫時還沒有找到解決方案。不過有卻有個用getadaptersinfo的成熟方法,使用動態鏈結。
為了使用動態鏈結,必須保證系統中存在 iphlpapi.dll 這個動態鏈結庫.
getadaptersinfo 函式 在mssdk中宣告為
dword getadaptersinfo(pip_adapter_info,pulong);
注意在宣告此函式型別時,請在型別前加入pascal呼叫約定 __stdcall
typedef dword (__stdcall *pgainfo)(pip_adapter_info,pulong);typedef struct _ip_adapter_info ip_adapter_info,*pip_adapter_info;
由於可能有多個網絡卡,因此
struct _ip_adapter_info* next
欄位為乙個鍊錶結構指標.
由於乙個網絡卡可能有多個
ip,因此
ip_addr_string
字段應該也是乙個鍊錶結構.
typedefstruct
_ip_addr_string
ip_addr_string;
typedef struct ip_address_string, *pip_address_string, ip_mask_string, *pip_mask_string;
再搜尋msdn將此結構中的三個巨集和兩個結構補全。
#define max_adapter_name_length 256注意宣告順序。#define max_adapter_description_length 128
#define max_adapter_address_length 8
typedef struct ip_address_string, *pip_address_string, ip_mask_string, *pip_mask_string;
typedef struct _ip_addr_string ip_addr_string, *pip_addr_string;
整個ip_adapter_info 結構的大小為 640byte。
注意呼叫getadaptersinfo時,如果第乙個引數分配的記憶體不夠,第二個引數將返回需要記憶體的大小,通過兩次呼叫,就可以得到系統網絡卡資訊。整個呼叫過程如下:
hmodule最後不要忘了釋放空間和動態鏈結庫..hinst
= loadlibrary
("iphlpapi.dll");
if(!hinst)
messagebox("iphlpapi.dll not supported in this platform!\n");
pgainfo pgainfo
= (pgainfo)getprocaddress(hinst,"getadaptersinfo");
if (pgainfo
== null)
ulong ulsize= 0
; pip_adapter_info pinfo
=null,d
=null
; while (pgainfo(pinfo,&ulsize) != error_success)
pinfo
= (pip_adapter_info) new(ip_adapter_info[esize]);
} getadaptersinfo 返回的是乙個鍊錶結構的網絡卡資訊,可以用迴圈遍歷得到每乙個網絡卡的資訊。
for(d
= pinfo
; d != null; dd
= d-
>
next) //列舉網絡卡資訊
delete pinfo;
freelibrary(hinst);
C 獲得本機物理網絡卡的MAC位址
今天中午吃飯前看到四月份記錄的乙個bug,當電腦用無線上網時,軟體無法開啟的情況,當時也沒去解決 客戶說換成有線就好了 午飯時想了想感覺應該在驗證授權時獲取mac位址出錯,吃完回來一看 果然是有點問題。授權時是根據本地網絡卡的mac位址授權的,登入時驗證授權時用的無線網絡卡的mac位址,所以導致軟體...
centos 增加網絡卡不能獲得ip位址
之後重啟網絡卡服務和重啟虛擬機器新增加的那個網絡卡都不能獲得位址。這裡先說下思路 1.檢查虛擬機器網絡卡橋接,在 vmware的 編輯 虛擬機器網路編輯器中,點進去會發現橋接如下圖 vmnet0 橋接到我電腦建立的虛擬網絡卡,vmnet1 橋接到我電腦的有線網絡卡了。2.對於vmware 而言選擇橋...
雙網絡卡或多網絡卡情況下獲得所有的IP位址
在編寫基於sock的網路程式時,有時需列舉系統中繫結的所有ip位址,在一般控制項無法解決些問題的情況下,可使用如下方法一試 include stdafx.h include include include include void main gethostname myname,80 取得主機名 t...