1. 程式人生 > >LINUX下獲取網絡卡IP地址和MAC地址,子網掩碼程式參考

LINUX下獲取網絡卡IP地址和MAC地址,子網掩碼程式參考

/*
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]# gcc -g -o get_ip get_ip.c
[[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 addifconfig的區別看linuxip地址的結構

                今天一個老外在郵件列表上問了一個問題,就是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 是否位於帶外標

Windowsbat指令碼修改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,要除