LINUX下獲取網絡卡IP地址和MAC地址,子網掩碼程式參考
[[email protected] temp]# gcc -g -o get_ip get_ip.c/* mode time:20120727 LINUX下獲取IP地址和MAC地址.程式相關結構體在程式後面。 列印網絡卡的ip地址 子網掩碼 廣播地址 mac地址 環境: [[email protected] temp]# uname -a Linux bogon 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 i686 i386 GNU/Linux */ #include <stdio.h> #include <sys/types.h> #include <sys/param.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <net/if.h> #include <netinet/in.h> #include <net/if_arp.h> #ifdef SOLARIS #include <sys/sockio.h> #endif #define MAXINTERFACES 16 /* 最大介面數 */ int main(int argc, char **argv) { register int fd, intrface, retn = 0; struct ifreq buf[MAXINTERFACES]; /* ifreq結構陣列 */ struct arpreq arp; struct ifconf ifc; if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0) { ifc.ifc_len = sizeof buf; ifc.ifc_buf = (caddr_t) buf; if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc)) { //獲取介面數量資訊 intrface = ifc.ifc_len / sizeof (struct ifreq); printf("interface num is intrface=%d\n",intrface); puts(""); //根據藉口資訊迴圈獲取裝置IP和MAC地址 while ( (intrface--) > 0) { //獲取裝置名稱 printf ("net device %s\n", buf[intrface].ifr_name); //判斷網絡卡型別 if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface]))) { if (buf[intrface].ifr_flags & IFF_PROMISC) { puts ("the interface is PROMISC"); retn++; } } else { char str[256]; sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name); perror (str); } //判斷網絡卡狀態 if (buf[intrface].ifr_flags & IFF_UP) { puts("the interface status is UP"); } else { puts("the interface status is DOWN"); } //獲取當前網絡卡的IP地址 if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface]))) { printf("IP address is:"); puts((char *)inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr)); //printf("\n%d\n"buf[intrface].ifr_addr))->sin_addr.s_addr); //puts (buf[intrface].ifr_addr.sa_data); } else { char str[256]; sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name); perror (str); } /* this section can't get Hardware Address,I don't know whether the reason is module driver*/ #ifdef SOLARIS //獲取MAC地址 arp.arp_pa.sa_family = AF_INET; arp.arp_ha.sa_family = AF_INET; ((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr.s_addr; if (!(ioctl (fd, SIOCGARP, (char *) &arp))) { printf("HW address is:"); //以十六進位制顯示MAC地址 printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char)arp.arp_ha.sa_data[0], (unsigned char)arp.arp_ha.sa_data[1], (unsigned char)arp.arp_ha.sa_data[2], (unsigned char)arp.arp_ha.sa_data[3], (unsigned char)arp.arp_ha.sa_data[4], (unsigned char)arp.arp_ha.sa_data[5]); puts(""); puts(""); } #else #if 0 /*Get HW ADDRESS of the net card */ if (!(ioctl (fd, SIOCGENADDR, (char *) &buf[intrface]))) { printf("HW address is:"); printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char)buf[intrface].ifr_enaddr[0], (unsigned char)buf[intrface].ifr_enaddr[1], (unsigned char)buf[intrface].ifr_enaddr[2], (unsigned char)buf[intrface].ifr_enaddr[3], (unsigned char)buf[intrface].ifr_enaddr[4], (unsigned char)buf[intrface].ifr_enaddr[5]); puts(""); } #endif if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface]))) { printf("HW address is:"); printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char)buf[intrface].ifr_hwaddr.sa_data[0], (unsigned char)buf[intrface].ifr_hwaddr.sa_data[1], (unsigned char)buf[intrface].ifr_hwaddr.sa_data[2], (unsigned char)buf[intrface].ifr_hwaddr.sa_data[3], (unsigned char)buf[intrface].ifr_hwaddr.sa_data[4], (unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]); } #endif else { char str[256]; sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name); perror (str); } //子網掩碼 if (!(ioctl(fd, SIOCGIFNETMASK, (char *) &buf[intrface]))) { printf("MASK:%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[intrface].ifr_addr))->sin_addr)); puts(""); } else { char str[256]; sprintf(str, "SIOCGIFADDR ioctl %s", buf[intrface].ifr_name); perror(str); } //廣播地址 if (! (ioctl(fd, SIOCGIFBRDADDR, (char *) &buf[intrface]))) printf("Broadcast Address:%s\n", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[intrface].ifr_addr))->sin_addr)); puts(""); puts(""); } //while } else perror ("cpm: ioctl"); } else perror ("cpm: socket"); close (fd); return retn; } /* #include <sys/ioctl.h> int ioctl(int fd, int request, … * void *arg *); 返回:成功返回0,失敗返回-1 char *inet_ntoa (struct in_addr); 返回點分十進位制的字串在靜態記憶體中的指標。 所在標頭檔案:<arpa/inet.h> 函式功能:將網路地址轉換成“.”點隔的字串格式。 所需庫: winsock.h #include<linux.h> struct ifconf { int ifc_len; /* size of buffer * union { char __user *ifcu_buf; struct ifreq __user *ifcu_req; } ifc_ifcu; }; struct ifreq { #define IFHWADDRLEN 6 union { char ifrn_name[IFNAMSIZ]; * if name, e.g. "en0" * } ifr_ifrn; union { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; struct sockaddr ifru_netmask; struct sockaddr ifru_hwaddr; short ifru_flags; int ifru_ivalue; int ifru_mtu; struct ifmap ifru_map; char ifru_slave[IFNAMSIZ]; /* Just fits the size * char ifru_newname[IFNAMSIZ]; void __user * ifru_data; struct if_settings ifru_settings; } ifr_ifru; }; #define ifr_name ifr_ifrn.ifrn_name /* interface name * #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address * #define ifr_addr ifr_ifru.ifru_addr /* address * #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk * #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address * #define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask * #define ifr_flags ifr_ifru.ifru_flags /* flags * #define ifr_metric ifr_ifru.ifru_ivalue /* metric * #define ifr_mtu ifr_ifru.ifru_mtu /* mtu * #define ifr_map ifr_ifru.ifru_map /* device map #define ifr_slave ifr_ifru.ifru_slave /* slave device * #define ifr_data ifr_ifru.ifru_data /* for use by interface * #define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index #define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth * #define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length * #define ifr_newname ifr_ifru.ifru_newname /* New name * #define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings* */
[[email protected] temp]# ./get_ip
interface num is intrface=2
net device eth1
the interface status is UP
IP address is:192.168.94.125
HW address is:00:0c:29:26:e4:f2
MASK:255.255.255.0
Broadcast Address:192.168.94.255
net device lo
the interface status is UP
IP address is:127.0.0.1
HW address is:00:00:00:00:00:00
MASK:255.0.0.0
Broadcast Address:0.0.0.0
相關推薦
spring cloud EurekaClient 多網絡卡 ip 配置 和 原始碼分析
1、前言 對於spring cloud,各個服務例項需要註冊到Eureka註冊中心。 一般會配置ip註冊,即eureka.instance.prefer-ip-address=true。 但是,如果服務例項所在的環境存在多個網絡卡,經常會出現註冊過去的ip不是我們想要的ip。
ubuntu 16.04 網絡卡配置要點 和檢視有幾塊網絡卡的命令
檢視系統有幾塊網絡卡 lspci |grep -i Eth 或者用 ip link 重啟網路命令,使用最新的systemctl systemctl restart networki
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下獲取網絡卡IP地址和MAC地址,子網掩碼程式參考
/* mode time:20120727 LINUX下獲取IP地址和MAC地址.程式相關結構體在程式後面。 列印網絡卡的ip地址 子網掩碼 廣播地址 mac地址 環境: [[email protected] temp]# uname -a Linux b
linux獲取活動網絡卡ip地址
1、根據ioctl機制列印當前所有網絡卡 程式碼: #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> #include <
linux c/c++按規則獲取網絡卡ip
linux c/c++按規則獲取網絡卡ip 輸出專案到雲或者輸出給外部客戶,會遇到伺服器多網絡卡多ip的情形,如果有多個應用都需要這個主機ip,而且多應用需要獲取相同的ip,此時可以約定一種規則來獲取相同的ip,比如: 獲得所有網絡卡名,然後對網絡卡名按從小到大排序,查詢最小
C#之獲取網絡卡IP地址
有時候不想讀取配置檔案來進行網路監聽,預設把本級所有IP地址監聽一遍,這個時候就需要獲取本級所有IP地址。 如下: string name = Dns.GetHostName(); IPAddress[] ipadrlist = Dns.Get
從ip addr add和ifconfig的區別看linux網絡卡ip地址的結構
今天一個老外在郵件列表上問了一個問題,就是ip addr add和ifconfig的區別,我給他進行了解答,可能因為英語不好吧,解答的很簡單,因此我還是要在這裡詳細說明一下。其實它們之間沒有什麼區別,只 是表述方式不同罷了。如果你非常理解網路協議的原理以及網路的分層架構那麼我想
Linux下如何修改網絡卡IP、DNS、HOSTNAME
---修改ip地址---臨時修改,即時生效,重啟失效:# ifconfig eth0 172.18.4.120 netmask 255.255.255.0永久修改,重啟生效:修改vi /etc/sysconfig/network-scripts/ifcfg-eth0---修改
python獲取網絡卡IP地址
#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import fcntl import struct def get_ip_address(ifname): s = sock
shell 獲取網絡卡IP地址 子網掩碼 預設閘道器 廣播地址 MAC地址
# IP地址 ifconfig eth0 | grep "inet addr:" | awk -F " " '{print $2}' | awk -F ":" '{print $2}' # 廣播地址 ifconfig eth0 | grep "inet addr:" |
delphi 獲取多網絡卡IP地址列表和Mac地址
1、宣告windows系統的sendarp函式 function sendarp(ipaddr: ulong; temp: dword; ulmacaddr: pointer; ulmacaddrleng: pointer): Dword; StdCall;External
linux配置網絡卡IP地址命令詳細介紹及一些常用網路配置命令
Linux命令列下配置IP地址不像圖形介面下那麼方 便,完全需要我們手動配置,下面就給大家介紹幾種配置的方法: 即時生效(重啟後失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //新增IP地址 rout
linux設定網絡卡ip為靜態地址
修改 /etc/network/interfaces。 安裝一下格式編輯: auto eth0 iface eth0 inet static address 192.168.x.xxx netmask 255.255.255.0 gateway 192.168.x.x
socket 通過 ioctl獲取 設定 網絡卡 IP 子網掩碼 本地廣播地址
參看 http://blog.chinaunix.net/uid-20692625-id-3172833.html 類別 Request 說明 資料型別 套 接 口 SIOCATMARK SIOCSPGRP SIOCGPGRP 是否位於帶外標
Windows下bat指令碼修改網絡卡ip
1.建立一個txt檔案,並把貼入如下程式碼: 把網絡卡設定ip為192.168.1.10 掩碼255.255.255.0 閘道器192.168.1.0 @echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecu
java獲取機器名及所有網絡卡IP
獲取機器名: public String getLocalHostName() { String hostName; try { In
主機上有多個網絡卡用java指定獲取某一個網絡卡ip的問題
前幾天寫過一個基於tomcat發郵件修改密碼的功能,大致是這樣: 點選修改密碼按鈕就傳送一封郵件去指定賬戶的郵箱,郵箱裡有個超連結和驗證碼,超連結開啟進入修改密碼頁面。之前能用,但是今天我的筆記本打開了獵豹免費wifi,造成有兩個網絡卡都被啟用,如下圖:
獲取本機網絡卡IP及對應的mac
#include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h>
9、網絡知識(路由交換和ARP協議)+配置單網卡多ip和配置默認路由
路由交換 ARP協議 網絡配置網絡知識詳解 提問:網絡到底是什麽?我們在電纜中傳輸的都是電信號(高電壓或者是低電壓),所以高電壓就是1,低電壓就是0,所以規定一定的時間傳輸固定的高低電壓來當做是接收的數據我們所謂的10Mbps:每秒中可以傳輸10M個bit所以別人說你的是4M的帶寬,指的就是4Mbps,要除