linux通過c語言介面獲取網絡卡資訊
方法一 通過ioctl的SIOCGIFCONF
例項1. 檢查特定的網絡卡是否存在
// ppp、wifi是否正常
static int check_ppp_wifi (int wifi_switch)
{
struct ifreq ifr;
struct ifconf ifc;
char buf[256];
int success = 0;
int wifi_exist = 0;
int ppp_exist = 0;
int ret = -1;
int sock = -1;
int count = 0;
if (wifi_switch == 0)
wifi_exist = 1;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock == -1) {
APP_LogPrintf(ALM_ERROR, "socket error\n");
goto out;
}
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) {
APP_LogPrintf(ALM_ERROR,"ioctl error\n");
goto out;
}
struct ifreq* it = ifc.ifc_req;
const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));
for (; it != end; ++it) {
strcpy(ifr.ifr_name, it->ifr_name);
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
// don't count loopback
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
count ++ ;
unsigned char * ptr ;
ptr = (unsigned char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
if (strncmp("ppp0", ifr.ifr_name, 4) == 0) {
ppp_exist = 1;
if (wifi_exist) {
ret = 0;
goto out;
}
} else if (strncmp("uap0", ifr.ifr_name, 4) == 0) {
wifi_exist = 1;
if (wifi_exist) {
ret = 0;
goto out;
}
}
}
}
} else {
APP_LogPrintf(ALM_ERROR,"get mac info error\n");
goto out;
}
}
out:
if (-1 != sock)
close(sock);
return ret;
}
例項2 列舉系統所有的網絡卡資訊
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
int main()
{
struct ifreq ifr;
struct ifconf ifc;
char buf[2048];
int success = 0;
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock == -1) {
printf("socket error\n");
return -1;
}
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) {
printf("ioctl error\n");
return -1;
}
struct ifreq* it = ifc.ifc_req;
const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));
char szMac[64];
int count = 0;
for (; it != end; ++it) {
strcpy(ifr.ifr_name, it->ifr_name);
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
count ++ ;
unsigned char * ptr ;
ptr = (unsigned char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
snprintf(szMac,64,"%02X:%02X:%02X:%02X:%02X:%02X",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
printf("%d,Interface name : %s , Mac address : %s \n",count,ifr.ifr_name,szMac);
}
}
}else{
printf("get mac info error\n");
return -1;
}
}
}
注意:使用的時候一定要記得關閉socket,不然可能會導致開啟檔案過多,程式崩潰。
方案二:通過getifaddrs()來實現
例項1 檢查特定網絡卡
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
int c_ifaddrs_netlink_status(const char *if_name )
{
struct ifaddrs *ifa = NULL, *ifList;
if (getifaddrs(&ifList) < 0) {
return -1;
}
for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr->sa_family == AF_INET) {
if (strcmp(ifa->ifa_name, if_name) ==0) {
if (!(ifa->ifa_flags & IFF_UP)) {
printf("DEVICE_DOWN\r\n");
freeifaddrs(ifList);
return 1;
}
if (!(ifa->ifa_flags & IFF_RUNNING)) {
printf("DEVICE_UNPLUGGED\r\n");
freeifaddrs(ifList);
return 2;
}
printf("DEVICE_LINKED\r\n");
freeifaddrs(ifList);
return 3;
}
}
}
printf(stderr, "DEVICE_NONE\r\n");
freeifaddrs(ifList);
return 0;
}
int main(int argc, char* argv[])
{
int i=0;
if (argc != 2) {
fprintf(stderr, "usage: %s <ethname>\r\n", argv[0]);
return -1;
}
i = c_ifaddrs_netlink_status(argv[1]);
fprintf(stderr,"c_ifaddrs_netlink_status if_status = %d\n", i );
return 0;
}
例項2 列舉系統所有網絡卡資訊
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
int main(int argc, char* argv[]) {
struct ifaddrs *ifc, *ifc1;
char ip[64] = {};
char nm[64] = {};
if(0 != getifaddrs(&ifc)) return -1;
ifc1 = ifc;
printf("iface\tIP address\tNetmask\n");
for (; NULL != ifc; ifc = (*ifc).ifa_next) {
printf("%s", (*ifc).ifa_name);
if (NULL != (*ifc).ifa_addr) {
inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_addr))->sin_addr), ip, 64);
printf("\t%s", ip);
} else {
printf("\t\t");
}
if (NULL != (*ifc).ifa_netmask) {
inet_ntop(AF_INET, &(((struct sockaddr_in*)((*ifc).ifa_netmask))->sin_addr), nm, 64);
printf("\t%s", nm);
} else {
printf("\t\t");
}
printf("\n");
}
freeifaddrs(ifc1);
return 0;
}
相關推薦
linux通過c語言介面獲取網絡卡資訊
方法一 通過ioctl的SIOCGIFCONF 例項1. 檢查特定的網絡卡是否存在 // ppp、wifi是否正常 static int check_ppp_wifi (int wifi_switch) { struct ifreq ifr
Linux下利用ioctl函式獲取網絡卡資訊
linux下的ioctl函式原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv]) 函式成功返回0,失敗返回-1. 其相關命令介面如下:
Linux下C語言的socket網絡編程
網絡編程 服務器 enter 編程 scanf 路由 client p s drl Server.c 1 #include <sys/types.h> 2 #include <sys/socket.h> 3 #include <n
linux c/c++按規則獲取網絡卡ip
linux c/c++按規則獲取網絡卡ip 輸出專案到雲或者輸出給外部客戶,會遇到伺服器多網絡卡多ip的情形,如果有多個應用都需要這個主機ip,而且多應用需要獲取相同的ip,此時可以約定一種規則來獲取相同的ip,比如: 獲得所有網絡卡名,然後對網絡卡名按從小到大排序,查詢最小
c# 多網絡卡 由【網路介面卡名】獲取網絡卡資訊,IP
c# 多網絡卡 由【網路介面卡名】獲取網絡卡資訊,IP 多網絡卡電腦中,網路介面卡的名字 多樣化! 專案中需要,根據網路介面卡 名字 獲取 單個網絡卡的IP: using System.Net.NetworkInformation;
Linux 配置ip 子介面 多網絡卡繫結
linux系統配置ip地址,圖形化介面略過,這裡只介紹文字行。做以下設定注意是否有此許可權檢視當前路由及閘道器資訊: [[email protected] ~]# netstat -r Kernel IP routing table Destination Gateway G
linux獲取網絡卡資訊
sar -n DEV 1 1|grep -E "(Average)|(平均)"|awk '{if(NR>1){a="";"dmesg |grep "$2"|grep \"Link is up\""|getline
c# 獲取網絡卡資訊
private IList<IPInfo> GetIPInfo() { IList<IPInfo> rIPList = new List<IPInfo>(); Networ
linux中使用ifconfig命令檢視網絡卡資訊時顯示為eth1,但是在network-scripts中只有ifcfg-eth0的配置檔案,並且裡面的NAME="eth0"
除了題目中的問題,其實在執行命令:service network restart時,會報錯: 解決辦法: 首先需要修改70-persistent-net.rules檔案: vim /etc/udev/rules.d/70-persistent-net.rules 然
linux中使用ifconfig命令檢視網絡卡資訊時顯示為eth1,但是在network-scripts中只有ifcfg-eth0的配置檔案,並且裡面的NAME="eth0"。
除了題目中的問題,其實在執行命令:service network restart時,會報錯: 解決辦法: 首先需要修改70-persistent-net.rules檔案: vim /etc/udev/rules.d/70-persistent-net.rules 然後修改ifcfg-eth0檔案: v
API函式GetAdaptersAddresses獲取網絡卡資訊MAC &IP &描述資訊
一 , 兩個函式 The GetAdaptersInfo function retrieves adapter information for the local computer The GetAdaptersAddresses function retrieves t
linux C語言獲取網絡卡對應IP地址
int get_gw_ip(char *eth, char *ipaddr){ int sock_fd; struct sockaddr_in my_addr; struct ifreq ifr; /**//* Get socket file descriptor */
linux下C語言獲取網絡卡MAC地址
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/socket.h&g
獲取網絡卡名稱 linux c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#incl
Linux下通過shell獲取網絡卡的ip地址和mac地址
ip=`ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'` mac=`ifconfig | grep HWaddr | awk -F" " '{print $5}'` 轉自:http://blog.csdn.
Linux下C獲取所有可用網絡卡資訊
在Linux下開發網路程式時,經常會遇到需要取本地網路介面名、IP、廣播地址、子網掩碼或者MAC地址等資訊的需求,最常見的辦法是配合巨集SIOCGIFHWADDR、SIOCGIFADDR、SIOCGIFBRDADDR與SIOCGIFNETMASK作為引數呼叫函式
C++ 中通過GetAdaptersInfo獲取網絡卡配置和Ip地址資訊
#include <WinSock2.h> #include <Iphlpapi.h> #include <iostream> using namespace std; #pragma comment(lib,"Iphlpapi.lib") //需要新增Iphlpapi
參考ethtool寫了個Linux設定、獲取網絡卡模式的介面
差不多一個月沒寫文章了,這期間,主要是搞一些比較複雜的問題,一直被搞,沒有搞其它的東西,也就沒寫出什麼東西來。 在找問題過程中,上網瞭解到ethtool這個工具十分強大,以為這個程式碼很複雜,而恰好領導要求我提供設定網絡卡資訊的介面,於是下了程式碼,研究了一下,參考了一下,
C/C++:Windows程式設計—程式碼獲取本地所有網絡卡資訊(網絡卡描述,IP地址,子網掩碼,MAC地址)
先看效果 看程式碼 使用 GetAdaptersInfo 函式獲取網絡卡的所有資訊。 MSDN函式說明 https://docs.microsoft.com/en-us/windows/desktop/api/iphlpapi/nf-iphlpapi-getadapters
linux程式設計獲取本機網絡卡資訊
轉自:https://blog.csdn.net/shaderdx/article/details/78403437 ifaddrs結構體定義如下: struct ifaddrs { &