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 |
是否位於帶外標記 |
int |
文件 |
FIONBIN |
設定/ 清除非阻塞I/O 標誌 |
int |
接 |
SIOCGIFCONF |
獲取所有介面的清單 |
struct ifconf |
ARP |
SIOCSARP |
建立/ 修改ARP 表項 |
struct arpreq |
路由 |
SIOCADDRT |
增加路徑 |
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
Linux多網絡卡多IP配置
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.