這種方法通過呼叫linux提供的應用介面函式:
getifaddrs、getnameinfo,遍歷裝置所有網絡卡獲取相關配置資訊;getnameinfo函式獲取本地網絡卡ip位址時,
有乙個bug:獲取到的ip位址可能被內環位址覆蓋,而獲取不到真正的ip位址。
例子:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include char* hostname_to_ip(char * hostname );
int main(int agrc,char *agrv)
for (ifa = ifaddr; ifa != null; ifa = ifa->ifa_next)
freeifaddrs(ifaddr);
return host;}}
}
出現bug的原因:
當套接字被繫結到乙個未指定的位址時,getsockname函式並不總是返回關於主機位址的資訊,除非套接字已經連線到connect或accept(例如,使用addr_any)。
除非套接字已連線,否則windows套接字應用程式不能假定將指定該位址。
將用於套接字的位址是未知的,除非套接字在多主機中使用時是連線的。
如果套接字使用無連線協議,則在套接字上發生i/o之前,位址可能不可用。 /
第二種:建立socket物件,利用socket物件掃瞄出裝置可用網絡卡
涉及重要的結構體:
struct ifreq、struct ifconf。這裡將避開第一種方案帶來的問題。
例子:
#include #include #include #include #include #include #include int get_local_ip(char *ip,char *dev)}}
}close(fd);
return 0;
}}int main(int agrc,char *agrv)
對結構體的詳解:
struct ifconf
ifc_ifcu;
}; //通常用來儲存所有的介面資訊
第三種,通過函式
inet_ntop,獲取到網絡卡資訊,類似於第一種方式,換了個函式。
例子:
#include #include #include #include #include int get_local_ip(char *ip)
ifaddrstruct=ifaddrstruct->ifa_next;
}//free ifaddrs
freeifaddrs(ifaddrstruct);
return 0;
}int main()
注意:和第一種方式一樣,如果裝置網絡卡只是被分配到ip位址而為發生任何io通訊,將被認為無效網絡卡!!!
系統介面獲取網絡卡ip位址
有時候程式需要獲取網絡卡的ip位址我們習慣於ifconfig獲取,有的人也使用popen用ifconfig來獲取但是現在我將介紹下通過系統介面獲取,如下 include include include include int getsubnetmask char ip for ifa iflist ...
linux獲取本機網絡卡ip位址
include include include include include include include include include define eth name eth0 int main strncpy ifr.ifr name,eth name,ifnamsiz ifr.ifr n...
網絡卡裝置資訊獲取
網絡卡工作在osi七層協議中的鏈路層,是主機與網路對接的重要介面,它完成了網路連線的物理和電訊號之間的轉換,同時還對網路資料報幀進行傳送 接收 校驗等,是上層網路應用的基石。在計算機架構中,通常是cpu通過內部匯流排 ahb bus 或者 pci bus 與mac控制單元通訊,然後由mac控制單元通...