linux c 怎么获得服务器mac 地址

linux c 怎么获得服务器mac 地址,第1张

获取服务器mac 复制代码 代码如下: <?php /** 获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetmacAddr{ var $result = array()// 返回带有MAC地址的字串数组 var $macAddr/*构造*/ function __construct($osType){ switch ( strtolower($osType) ){ case "unix": breakcase "solaris": breakcase "aix": breakcase "linux": { $this->for_linux_os()}breakdefault: { $this->for_windows_os()}break} $temp_array = array()foreach($this->result as $value){ if(preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value, $temp_array ) ){ $this->macAddr = $temp_array[0]break} } unset($temp_array)return $this->macAddr} /*linux系统中获取方法*/ function for_linux_os(){ @exec("ifconfig -a", $this->result)return $this->result} /*win系统中的获取方法*/ function for_windows_os(){ @exec("ipconfig /all", $this->result)if ( $this->result ) { return $this->result} else { $ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe"if(is_file($ipconfig)) { @exec($ipconfig." /all", $this->result)} else { @exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->result)return $this->result} } } } ?> 获取客户端mac地址: 复制代码 代码如下: @exec("arp -a",$array)//执行arp -a命令,结果放到数组$array中 foreach($array as $value){ //匹配结果放到数组$mac_array if(strpos($value,$_SERVER["REMOTE_ADDR"]) &&preg_match("/(:?[0-9A-F]{2}[:-]){5}[0-9A-F]{2}/i",$value,$mac_array)){ $mac = $mac_array[0]break} } echo $mac 注:客户端获取的mac不能在本机测试,只能用别的电脑访问才能输出

第一步:激活网卡 系统装好后默认的网卡是eth0,用下面的命令将这块网卡激活。

ifconfig eth0 up 第二步:设置网卡进入系统时启动想要每次开机就可以自动获取IP地址上网,就要设置网络服务在系统启动时也启动。

Linux有一点与windows不同的是很多服务默认是停止的,而且在某次使用该服务时启动这个服务,但是没设置它为默认启动,则下次进入系统这个服务依然是停止的。

下面是设置网络服务在系统启动时也启动的方法。

使用chkconfig命令让网络服务在系统启动级别是2345时默认启动。

# chkconfig --level 2345 network on第三步:修改网卡文件ifcfg-eth0修改ifcfg-eth0文件,设置ONBOOT的值为yes

向大家介绍一下我们将如何获得一台主机的IP地址。在Win32 API中我们可以使用NetWork API完成这项工作,但是在.Net平台下我们应当如何做呢?其实操作方法与API差不多,只是大家要理解一下Namespace与Class。本站这方面的文章很多,关于Namespace与Class的内容就不介绍了。

.Net平台存在System.Net命名空间,其中的DNS类,提供了一些方法可以获取服务器的服务名或者是IP地址。DNS是一个静态类,所以它能够直接创建类实例。闲话少说,我们来看具体的程序:

namespace NKUtilities

{

using System

using System.Net

public class DNSUtility

{

public static int Main (string [] args)

{

String strHostName = new String ("")

if (args.Length == 0)

{

// 获得本地的IP地址

//首先获了本地机的主机名

strHostName = DNS.GetHostName ()

Console.WriteLine ("Local Machine''s Host Name: " + strHostName)

}

else

{

strHostName = args[0]

}

// 接着使用主机名,获取IP地址列表

// 一台主机可能不只一个IP哦,不要被某些人误导了,呵呵,想想以前的163与169就知道了

IPHostEntry ipEntry = DNS.GetHostByName (strHostName)

IPAddress [] addr = ipEntry.AddressList

for (int i = 0i <addr.Lengthi++)

{

Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ())

}

return 0

}

}

}

如果你想获得主机名,你可以使用不带参数的GetHostName方法,接着使用这个主机名作为参数交给GetHostByName方法,以获取IPAddress列表。最后是输出列表中的IP地址。

C#编程之 如何获取本地和远程主机的IP及MAC地址

利用dns类和WMI规范获取IP及MAC地址

在C#编程中,要获取主机名和主机IP地址,是比较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址.

示例:

string strHostName = Dns.GetHostName() //得到本机的主机名

IPHostEntry ipEntry = Dns.GetHostByName(strHostName)//取得本机IP

string strAddr = ipEntry.AddressList[0].ToString()//假设本地主机为单网卡

在这段代码中使用了两个类,一个是Dns类,另一个为IPHostEntry类,二者都存在于命名空间System.Net中.

Dns类主要是从域名系统(DNS)中检索关于特定主机的信息,上面的代码第一行就从本地的DNS中检索出本地主机名.

IPHostEntry类则将一个域名系统或主机名与一组IP地址相关联,它与DNS类一起使用,用于获取主机的IP地址组.

要获取远程主机的IP地址,其方法也是大同小异.

在获取了IP地址后,如果还需要取得网卡的MAC地址,就需要进一步探究了.

这里又分两种情况,一是本机MAC地址,二是远程主机MAC地址.二者的获取是完全不同的.

在获取本机的MAC地址时,可以使用WMI规范,通过SELECT语句提取MAC地址.在.NET框架中,WMI规范的实现定义在System.Management命名空间中.

ManagementObjectSearcher类用于根据指定的查询检索管理对象的集合

ManagementObjectCollection类为管理对象的集合,下例中由检索对象返回管理对象集合赋值给它.

示例:

ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration")

ManagementObjectCollection queryCollection = query.Get()

foreach( ManagementObject mo in queryCollection )

{

if(mo["IPEnabled"].ToString() == "True")

mac = mo["MacAddress"].ToString()

}

获取远程主机的MAC地址时,需要借用API函数SendARP.该函数使用ARP协议,向目的主机发送ARP包,利用返回并存储在高速缓存中的IP和MAC地址对,从而获取远程主机的MAC地址.

示例:

Int32 ldest= inet_addr(remoteIP)//目的ip

Int32 lhost= inet_addr(localIP)//本地ip

try

{

Int64 macinfo = new Int64()

Int32 len = 6

int res = SendARP(ldest,0, ref macinfo, ref len) //发送ARP包

return Convert.ToString(macinfo,16)

}

catch(Exception err)

{

Console.WriteLine("Error:{0}",err.Message)

}

return 0.ToString()

但使用该方式获取MAC时有一个很大的限制,就是只能获取同网段的远程主机MAC地址.因为在标准网络协议下,ARP包是不能跨网段传输的,故想通过ARP协议是无法查询跨网段设备MAC地址的。

示例程序:

using System.Net

using System

using System.Management

using System.Runtime.InteropServices

public class getIP

{

[DllImport("Iphlpapi.dll")]

private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length)

[DllImport("Ws2_32.dll")]

private static extern Int32 inet_addr(string ip)

//获取本机的IP

public string getLocalIP()

{

string strHostName = Dns.GetHostName() //得到本机的主机名

IPHostEntry ipEntry = Dns.GetHostByName(strHostName)//取得本机IP

string strAddr = ipEntry.AddressList[0].ToString()

return(strAddr)

}

//获取本机的MAC

public string getLocalMac()

{

string mac = null

ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration")

ManagementObjectCollection queryCollection = query.Get()

foreach( ManagementObject mo in queryCollection )

{

if(mo["IPEnabled"].ToString() == "True")

mac = mo["MacAddress"].ToString()

}

return(mac)

}

//获取远程主机IP

public string[] getRemoteIP(string RemoteHostName)

{

IPHostEntry ipEntry = Dns.GetHostByName(RemoteHostName)

IPAddress[] IpAddr = ipEntry.AddressList

string[] strAddr = new string[IpAddr.Length]

for (int i=0i {

strAddr[i] = IpAddr[i].ToString()

}

return(strAddr)

}

//获取远程主机MAC

public string getRemoteMac(string localIP, string remoteIP)

{

Int32 ldest= inet_addr(remoteIP)//目的ip

Int32 lhost= inet_addr(localIP)//本地ip

try

{

Int64 macinfo = new Int64()

Int32 len = 6

int res = SendARP(ldest,0, ref macinfo, ref len)

return Convert.ToString(macinfo,16)

}

catch(Exception err)

{

Console.WriteLine("Error:{0}",err.Message)

}

return 0.ToString()

}

public static void Main(string[] args)

{

getIP gi = new getIP()

Console.WriteLine("本地网卡信息:")

Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac())

Console.WriteLine("/n/r远程网卡信息:")

string[] temp = gi.getRemoteIP("scmobile-tj2")

for(int i=0i {

Console.WriteLine(temp[i])

}

Console.WriteLine(gi.getRemoteMac("192.168.0.3","192.168.0.1"))

}

}

可以用.Net的DNS类来获取一个主机名或一个给定主机的IP地址。要想在程序中使用DNS类,就需要包含System.Net:

Include System.Net Reference

比如说想获取http://www.mindcracker.com/的IP地址,以下代码就会完成这个任务:

// Call DNS.GetHostName to get IPHostEntry and get the IP address list.

IPHostEntry ipEntry = DNS.GetHostByName ("www.mindcracker.com")

IPAddress [] IpAddr = ipEntry.AddressList

for (int i = 0i <IpAddr.Lengthi++){

Console.WriteLine ("IP Address {0}: {1} ", i, IpAddr[i].ToString ())

}

另外,使用无参数的GetHostName可以返回本地机器的主机名:

string strHostName = DNS.GetHostName ()

然后将这个主机名作为参数传递给GetHostByName,就可以获取本地机器的IP地址信息。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/243744.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存