1. 程式人生 > >linux通過c語言介面獲取網絡卡資訊

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. 其相關命令介面如下:

LinuxC語言的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 */ 

linuxC語言獲取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.

LinuxC獲取所有可用資訊

在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    {      &