1. 程式人生 > >Linux下使用ioctl獲取硬體資訊------案例一

Linux下使用ioctl獲取硬體資訊------案例一

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <net/if.h>
    #include <string.h>

    unsigned char g_eth_name[16];
    unsigned char g_macaddr[16];
    unsigned int g_subnetmask;
    unsigned int g_ipaddr;
    unsigned int g_broadcast_ipaddr;

    //初始化網路,獲取當前網路裝置資訊
    void init_net(void)
    {
        int i ;
        int sock;
        struct sockaddr_in sin;
        struct ifreq ifr;
        
        sock=socket(AF_INET, SOCK_DGRAM, 0);
        if(sock==-1)
            perror("socket");
        strcpy(g_eth_name, "eth0");
        strcpy(ifr.ifr_name, g_eth_name);
        printf("eth name:\t%s\n", g_eth_name);

        //獲取並列印網絡卡地址
        if(ioctl(sock, SIOCGIFHWADDR, &ifr) <0 )
            perror("ioctl error\n");
        memcpy(g_macaddr, ifr.ifr_hwaddr.sa_data,6);
        printf("local mac:\t");
        for(i=0;i<5;i++)
            printf("%.2x:", g_macaddr[i]);
        printf("%.2x\n",g_macaddr[i]);
        
        //獲取並列印IP地址
        if(ioctl(sock, SIOCGIFADDR, &ifr)<0)
            perror("ioctl error\n");
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        g_ipaddr = sin.sin_addr.s_addr;
        printf("local eth0:\t%s\n", inet_ntoa(sin.sin_addr));
        
        //獲取並列印廣播地址
        if(ioctl(sock, SIOCGIFBRDADDR, &ifr)<0)
            perror("ioctl error\n");
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        g_broadcast_ipaddr = sin.sin_addr.s_addr;
        printf("broadcast:\t%s\n", inet_ntoa(sin.sin_addr));
        
        //獲取並列印子網掩碼
        if(ioctl(sock,SIOCGIFNETMASK,&ifr)<0)
            perror("ioctl error\n");
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        g_subnetmask = sin.sin_addr.s_addr;
        printf("subnetmask:\t%s\n", inet_ntoa(sin.sin_addr));
        
        close(sock);
    }

    int main()
    {
        //initialize
        init_net();
        //do something
        //....
        return 0;
    }

執行結果:

               eth name:    eth0
               local mac:    34:97:f6:da:6c:ab
               local eth0:    192.168.2.33
               broadcast:    192.168.2.255
               subnetmask:    255.255.255.0


相關推薦

Linux使用ioctl獲取硬體資訊------案例

    #include <stdio.h>     #include <stdlib.h>     #include <sys/types.h>     #include <sys/stat.h>     #include

Linuxioctl獲取介面資訊

一、ifconf和ifreq結構 //ifconf通常是用來儲存所有介面資訊的 //if.h struct ifconf { int ifc_len; /* size of buffer */ union { char *ifcu_buf; /* input fr

獲取PC硬體資訊方法:利用Java Applet

 Java Applet可以執行在網頁上面,實現功能是通過呼叫Java來獲取本地硬碟資訊,前提是本機必須安裝Java環境才能執行,不然會提示你安裝。 下面是程式碼: package com.test; import java.applet.Applet; impo

linuxsnmp4j獲取net-snmp的基本資訊

linux下,net-snmp已經提供了完整的snmp服務和框架,尤其是基本的snmp資訊,如sysObjectId、CPU、記憶體等。通過標準的snmp的oid,可以很容易的從net-snmp所提供的服務中獲取這些資訊。但net-snmp的trap功能需要通過指令碼來配置

LinuxC獲取所有可用網絡卡資訊

在Linux下開發網路程式時,經常會遇到需要取本地網路介面名、IP、廣播地址、子網掩碼或者MAC地址等資訊的需求,最常見的辦法是配合巨集SIOCGIFHWADDR、SIOCGIFADDR、SIOCGIFBRDADDR與SIOCGIFNETMASK作為引數呼叫函式

linuxC獲取文件的大小

錯誤代碼 返回 system sys string 文件系統 識別碼 連接 chm 獲取文件大小這裏有兩種方法: 方法一、 範例: unsigned long get_file_size(const char *path) { unsigned lo

從零開始搭建linuxlaravel 5.6環境(

yum acad 分享圖片 tps .html 啟動 服務 all 從零開始 首先你需要有一臺linux服務器,或者虛擬機,這裏就不贅述了,不會的可以自行百度。 我這裏準備的是一臺騰訊雲服務器,系統為CentOS 7.4 64位。 你可以使用騰訊雲的登錄按鈕登錄到服務器 也

Linux程式設計獲取本地IP地址的常見方法

轉載於:http://blog.csdn.net/k346k346/article/details/48231933   在進行linux網路程式設計時,經常用到本機IP地址。本文羅列一下常見方法,以備不時之需。 獲取本機IP地址,是一個相當靈活的操作,原因是網路地址的設定非常靈活而且都是允

Linux檢查和收集硬體資訊的常用命令總結

                   Linux檢查和收集硬體資訊的常用命令總結                                               作者:尹正傑 版權宣告:原創作品,謝絕轉載!否則將追究法律責任。       Linux基礎真的很重要,基

Linuxjava獲取CPU、記憶體、磁碟IO、網路頻寬使用率

原文地址:https://www.cnblogs.com/gisblogs/p/3985393.html 一、CPU 使用proc檔案系統,"proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過p

linux系統上檢視硬體資訊

一:檢視CPU more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如果覺得需要看的更加舒服 grep "model name" /proc/cpuinfo | cut -f2 -d:

批處理獲取硬體資訊

首先宣告:本程式尚未完善,依然在除錯中,以後會根據大家的測試結果不斷更新優化(目前核心程式碼基本完善)! 由於原創區需要一定的許可權才能發表原創作品 實在沒辦法所以在這裡釋出,望管理員見諒! 本程式特性: 1.執行環境判斷,若自身被修改則自動閃退;若PE環境則提示並指引退出;若虛擬機器環境則提示資訊

linux安裝mysql等資訊

1.安裝 apt-get update;// 第一次的時候,你更新一下你的軟體包的源地址資料; apt-get install mysql-server 2.賬號登陸 mysql -h localhost -u root -p -h資料庫主機 -u使用者 -p密

linux檢視軟體版本資訊

 1. 檢視linux的核心版本,系統資訊: 常用的有三種辦法:      uname -a;   more /etc/issue;    cat /proc/version;  2. 檢視apache的版本資訊,如果是通過yum,或者是rpm安裝的,可以使用rpm -q

Linux驅動開發除錯技術(

驅動程式開發的一個重大難點就是不易除錯。本文目的就是介紹驅動開發中常用的幾種直接和間接的除錯手段,它們是:     使用printk     檢視OOP訊息     使用strace     使用核心內建的hacking選項     使用ioctl方法     使用/proc 檔案系統     使用

LNMP-LinuxNginx+MySQL+PHP+phpMyAdmin+eAcelerator鍵安裝包(2009年11月17日更新)

引用www.dachunblog.com LNMP是一個基於CentOS編寫的Nginx、PHP、MySQL、phpMyAdmin、eAcelerator一鍵安裝包。可以在VPS、獨立主機上輕鬆的安裝LNMP生產環境。 LNMP Ver0.3軟體版本說明(2009年11月

linuxtomcat無法訪問問題(換種說法:無法訪問8080埠)

有時候linux下的tomcat其他機器無法訪問,比如主機無法訪問linux虛擬機器的tomcat,這是因為tocat的埠,linux沒有對外開放,所以只能localhost訪問,但是別的機器訪問不了;解決方法如下 編輯linux的iptables檔案:vi /etc/sy

Linuxioctl函數理解

簡單 類型 使用 序列號 socket編程 串口 case 通過命令 switch 一、 什麽是ioctl ioctl是設備驅動程序中對設備的I/O通道進行管理的函數。所謂對I/O通道進行管理,就是對設備的一些特性進行控制,例如串口的傳輸波特率、馬達的轉速等等。它的調用個數

ftp使用1——Linuxwget獲取ftp目錄檔案

如果某個目錄下有一個檔案可以使用ftp命令: get xxx 如果是某個目錄下有多個檔案(且不需要獲取目錄下子資料夾下的內容): mget * 如果是某個目錄下有子目錄希望獲取所有子目錄: wget -nH -m --ftp-user=myusername--f

linuxC獲取系統時間的方法

asctime(將時間和日期以字串格式表示)   相關函式  time,ctime,gmtime,localtime   表頭檔案  #include<time.h>   定義函式  char * asctime(const struct tm * ti