1. 程式人生 > >linux中讀取網絡卡資訊(ip, mask, mac)以及判斷物理網線是否插好的C程式---我親自試了一下,還不錯!

linux中讀取網絡卡資訊(ip, mask, mac)以及判斷物理網線是否插好的C程式---我親自試了一下,還不錯!

      說明: 我主要轉載如下兩篇文章, 但本文中加入了自己的一些描述微笑

      轉載地址一:http://blog.chinaunix.net/uid-20692625-id-3172833.html

      轉載地址二:http://blog.chinaunix.net/uid-8048969-id-3417143.html

      在linux系統中, 我們可以通過ifconfig命令來查詢網絡卡資訊, 也可以獲知物理網線是否插好, 先看地址一中的介紹:

ioctl在socket中的一些用法及示例
函式 : ioctl(int fd, int request, void * arg)
定義 : <sys/ioctl.h>
功能 : 控制I/O裝置, 提供了一種獲得裝置資訊和向裝置傳送控制引數的手段.
引數 : int  fd      檔案控制代碼. 用於socket時, 是socket套接字.
       int  request 函式定義的所有操作. 關於socket的操作, 定義在<linux/sockios.h>檔案中.
       void *arg    指標的型別依賴於request引數. 以下表格從網上收集了request - arg指標型別的對應關係

類別

Request

說明

資料型別

SIOCATMARK 
SIOCSPGRP 
SIOCGPGRP

是否位於帶外標記 
設定套介面的程序ID 或程序組ID 
獲取套介面的程序ID 或程序組ID

int 
int 
int

FIONBIN 
FIOASYNC 
FIONREAD 
FIOSETOWN 
FIOGETOWN

設定/ 清除非阻塞I/O 標誌 
設定/ 清除訊號驅動非同步I/O 標誌 
獲取接收快取區中的位元組數 
設定檔案的程序ID 或程序組ID 
獲取檔案的程序ID 或程序組ID

int 
int 
int 
int 
int

SIOCGIFCONF 
SIOCSIFADDR 
SIOCGIFADDR 
SIOCSIFFLAGS 
SIOCGIFFLAGS 
SIOCSIFDSTADDR 
SIOCGIFDSTADDR 
SIOCGIFBRDADDR 
SIOCSIFBRDADDR 
SIOCGIFNETMASK 
SIOCSIFNETMASK 
SIOCGIFMETRIC 
SIOCSIFMETRIC 
SIOCGIFMTU 
SIOCxxx

獲取所有介面的清單 
設定介面地址 
獲取介面地址 
設定介面標誌 
獲取介面標誌 
設定點到點地址 
獲取點到點地址 
獲取廣播地址 
設定廣播地址 
獲取子網掩碼 
設定子網掩碼 
獲取介面的測度 
設定介面的測度 
獲取介面MTU 
(還有很多取決於系統的實現)

struct ifconf 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq

ARP

SIOCSARP 
SIOCGARP 
SIOCDARP

建立/ 修改ARP 表項 
獲取ARP 表項 
刪除ARP 表項

struct arpreq 
struct arpreq 
struct arpreq

SIOCADDRT 
SIOCDELRT

增加路徑 
刪除路徑

struct rtentry
struct rtentry

I_xxx

socket最常用到的結構體: struct ifreq 定義在<net/if.h>.(包括struct ifconf/ifr_flags等的定義)

       程式為:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include "net/if.h"
#include "arpa/inet.h"
#include "linux/sockios.h"

int main(int argc,char *argv[])
{
    struct sockaddr_in *addr;
    struct ifreq ifr;
    char*address;
    int sockfd;

    char *name = "eth0";
    if( strlen(name) >= IFNAMSIZ)
        printf("device name is error.\n"), exit(0);
        
    strcpy( ifr.ifr_name, name);
        
    sockfd = socket(AF_INET,SOCK_DGRAM,0);

    //get inet addr
    if( ioctl( sockfd, SIOCGIFADDR, &ifr) == -1)
        printf("ioctl error.\n"), exit(0);

    addr = (struct sockaddr_in *)&(ifr.ifr_addr);
    address = inet_ntoa(addr->sin_addr);

    printf("inet addr: %s\n",address);

    //get Mask
    if( ioctl( sockfd, SIOCGIFNETMASK, &ifr) == -1)
        printf("ioctl error.\n"), exit(0);

    addr = (struct sockaddr_in *)&ifr.ifr_addr;
    address = inet_ntoa(addr->sin_addr);

    printf("Mask: %s\n",address);

    //get HWaddr 
    u_int8_t hd[6];
    if(ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1)
        printf("hwaddr error.\n"), exit(0);

    memcpy( hd, ifr.ifr_hwaddr.sa_data, sizeof(hd));
    printf("HWaddr: %02X:%02X:%02X:%02X:%02X:%02X\n", hd[0], hd[1], hd[2], hd[3], hd[4], hd[5]);
    
    exit(0);
}
       我試過了, 這個程式用gcc編譯是ok的, 且能正確讀取網絡卡資訊。

       好, 我們繼續看轉載地址二中如何判斷物理網線是否插好, 看程式吧(我略微刪改了一下):

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <linux/if_ether.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <string.h>

#define ETH_NAME    "eth0"

int check_nic(void)
{
    struct ifreq ifr;
    int skfd = socket(AF_INET, SOCK_DGRAM, 0);

    strcpy(ifr.ifr_name, ETH_NAME);
    if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
    {
        close(skfd);
        return -1;
    }
    if(ifr.ifr_flags & IFF_RUNNING){
        printf("link up\n");
        close(skfd);
        return 0; // 網絡卡已插上網線
    }else {
        printf("link down\n");
        close(skfd);
        return -1;
    }
}


int main(void) {
    check_nic();
    return 0;
}
       我用gcc編譯並測試了一下, 確實可以看到物理連線是否ok.

      我們可以通過ifconfig獲取網絡卡的具體資訊,並看到網絡卡對應的物理網路連線是否ok.  當然, 也可以通過上面的兩個程式實現該功能。 最後要說一下,網上類似的程式很多很多, 不禁感嘆, 網際網路真是個好東西。

       最後補充一下無線的情況: 如果電腦上的無線網路開關沒有開啟, 那麼上面的ioctl會返回小於0的數值, 如果電腦上的無線網路打開了但沒有接入無線, 那就相當於not running, 如果電腦上的無線網路打開了且接入無線,那麼就是running狀態了。

相關推薦

linux讀取資訊(ip, mask, mac)以及判斷物理網線是否C程式---親自一下不錯

      說明: 我主要轉載如下兩篇文章, 但本文中加入了自己的一些描述       轉載地址一:http://blog.chinaunix.net/uid-20692625-id-3172833.html       轉載地址二:http://blog.chinaun

配置Linux的eth0設定IP地址以及啟動方式

// 進入網絡卡設定配置目錄 [[email protected] ~]# cd/etc/sysconfig/network-scripts/ // 選擇需要配置的網絡卡,用vi編輯器開啟 [[email protected]]#vi ifcfg-eth

linux檢視mac地址

1. ifconfig -a 其中 HWaddr欄位就是mac地址2. cat /sys/class/net/eth0/address 檢視eth0的mac地址3. cat /proc/net/arp 檢視連線到本機的遠端ip的mac地址4. 程式中使用SIOCGIFHW

Linux作業系統單IP的設定

Centos5下: 1、配置第一個IP地址:     [[email protected] root]#cd /etc/sysconfig/network-scripts      [[email protected] network-script

Linux下多不同IP在同一段的情況

關鍵字:Strict Interface ARP, Multi-link, Multipath, Multiple network cards on same subnet problem 公司那個提供音樂下載的域名流量直逼1Gbps,但是系統的連線卻不高,伺服器用的是DELL2850的,板載兩個Gbe的

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

c# 多 由【網路介面卡名】獲取資訊IP

c# 多網絡卡 由【網路介面卡名】獲取網絡卡資訊,IP 多網絡卡電腦中,網路介面卡的名字 多樣化! 專案中需要,根據網路介面卡 名字 獲取 單個網絡卡的IP: using System.Net.NetworkInformation;

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

Linux遠端管理命令之IP地址

網絡卡 網絡卡是一個專門負責網路通訊的硬體裝置 IP地址是設定在網絡卡上的地址資訊 我們可以把電腦比作電話,網絡卡相當於SIM卡,IP地址相當於電話號碼 IP地址 每天聯網的電腦上都有IP地

VM linux虛擬機器新增修改ip 並修改mac地址

修改ip 開啟終端 vi /etc/sysconfig/network-script/ifcfg-eth0; 具體是哪個可以到這個目錄地下檢視一下,我的是ifcfg-system-eth0. 開啟檔案後修改裡面的ip地址,IPADRR這一項是填寫ip地址的地方。 然後開啟拎一個檔案檢視我

linux刪除資訊重新設定

centos系統刪除多餘網絡卡的方法 一、刪除系統中中多餘的ifcfg-eth0.bak Centos系統更改網絡卡或網絡卡MAC地址後會出現個eth0.bak配置備份檔案 解決方法: /etc/sysconfig/networking/devices目錄下,將if

linux獲取活動ip地址

1、根據ioctl機制列印當前所有網絡卡 程式碼: #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> #include <

Openstack使用多ip

文章來自作者維護的社群微信公眾號【虛擬化雲端計算】)建立虛擬機器時主機上會有一條iptables 用來將ip和mac繫結,用來防止arp欺騙。在需要給單個網絡卡配置多個ip的場景下(例如keepalive)另外新增的ip地址是無法與外界通訊的。 兩種方法來解決。第一種是使用a

LinuxIP配置

echo "210 local100" >> /etc/iproute2/rt_tables echo "220 local200" >> /etc/iproute2/rt_tables echo "230 local300" >> /etc

Linux下利用ioctl函式獲取資訊

linux下的ioctl函式原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv]) 函式成功返回0,失敗返回-1. 其相關命令介面如下:

linux 獲取eth0(指定IP地址(或MAC地址)

引言 使用場景: 我使用的Linux伺服器上有多個網絡卡,有時候就需要在指令碼中使用到指定網絡卡的IP地址或MAC地址,那麼這個時候就有兩種做法,一是預先讀取網絡卡的IP地址或MAC地址,然後寫入到指令碼中;另外一種方法就是通過shell命令實時獲取指定網絡卡上的當前

linux下一個配置多個ip【虛擬ip

Linux下配置網絡卡ip別名何謂ip別名?用windows的話說,就是為一個網絡卡配置多個ip。什麼場合增加ip別名能派上用場?佈網需要、多ip訪問測試、特定軟體對多ip的需要...and so on.下面通過幾個例子簡單介紹一下如何使用ifconfig命令給網絡卡配置

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.