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

news/2025/5/21 0:05:07

这篇文章,我们不准备大规模的讨论技术问题。只是向大家介绍一下我们将如何获得一台主机的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 = 0; i < addr.Length; i++)
{
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=0;i   {
    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=0;i   {
         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 = 0; i < IpAddr.Length; i++){
   Console.WriteLine ("IP Address {0}: {1} ", i, IpAddr[i].ToString ());
}
  另外,使用无参数的GetHostName可以返回本地机器的主机名:
string strHostName = DNS.GetHostName ();
  然后将这个主机名作为参数传递给GetHostByName,就可以获取本地机器的IP地址信息。
 

文章来源:https://blog.csdn.net/zhanghefu/article/details/1591622
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-759885.html

相关文章

osg fbo(五) 通过shader计算纹理坐标并采样

在前边几节&#xff0c;纹理坐标数组是在生成geometry前指定的。 这里在shader里计算&#xff0c; 一&#xff0c;注释掉geometry中的纹理坐标 //osg::ref_ptr<osg::Vec2Array> texCoord new osg::Vec2Array; //texCoord->push_back(osg::Vec2(0.0, 0.0)); //texCoo…

python内部变量_python中的动态变量问题

先看一段代码 print locals 输出的是 {__builtins__: , __name__:__main__, __doc__: None, __package__: None}a 1 print locals()输出是 {__builtins__: , __name__: __main__, __doc__: None, a: 1, __package__: None} 注意&#xff1a;多了一个a:1def b(): print locals(…

Proxy Authentication Required解决

症状 <script type"text/javascript">loadTOCNode(1, symptoms);</script> 如果 Internet Security and Acceleration (ISA) Server 2000 是链接到上游 Web 代理服务器, Web 浏览器中可能会收到完整 HTML 页和随机身份验证提示。 如果下游 ISAServer 计算…

2023年1月9日--1月15日(osg+glsl+ue+socket,42小时,合计1859小时,剩余8141小时)

目前&#xff0c;ue视频教程进行到了mysql(7.1)&#xff0c;tf1(4.11),oss(12.2),蓝图反射(1.9)&#xff0c;moba&#xff08;1.5&#xff09;webapp&#xff08;2.4&#xff09;&#xff0c;mmoarpg(00A_04)&#xff0c;socket(2.57)Opengl (5.9),GLSL(2.8) 周一到周五&#…

.NET Remoting 安全性

第 11 章 – .NET Remoting 安全性 更新日期&#xff1a; 2004年04月20日本页内容 本章内容目标适用范围如何使用本章内容.NET Remoting 体系结构.NET Remoting 网关守卫身份验证授权身份验证和授权策略访问系统资源访问网络资源将身份验证的凭据传递给远程对象传递原调用方受…

最通俗易懂的flex讲解

30分钟彻底弄懂flex布局 欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由elson发表于云社区专栏 目前在不考虑IE以及低端安卓机&#xff08;4.3-&#xff09;的兼容下&#xff0c;已经可以放心使用flex进行布局了。什么是flex布局以及它的好处&…

2023年1月16日--2023年1月22日(osg+glsl+socket+ue, 本周20小时,合计1879小时,剩余8121小时)

目前&#xff0c;ue视频教程进行到了zccs&#xff08;预1&#xff09;&#xff0c;mysql(7.1)&#xff0c;tf1(4.11),o s s (12.2),蓝图反射(1.9)&#xff0c;moba&#xff08;1.5&#xff09;webapp&#xff08;2.4&#xff09;&#xff0c;mmoarpg(00A_04)&#xff0c;socket…

网络设备更换、域架构项目小结

这两个月&#xff0c;负责一家日本公司上海代表处的设备更换、域架构项目。在此作一下总结。 一、网络结构 该公司原来的网络结构很简单&#xff0c;一台小型路由器&#xff0c;一台Juniper netscreen-25防火墙&#xff0c;两台二层的D&#xff0d;Link Des-1024R傻瓜交换机&am…

笨方法学python3怎么样_在python3中如何实现《笨方法学Python》ex11中的效果

书中python2.X的代码&#xff1a; print “How old are you?”, age raw_input() #输入38 实现的效果 How old are you? 38 #38紧跟着第一行 书上说在每行print后面加了个逗号&#xff08;&#xff0c;&#xff09;&#xff0c;print就不会输出换行符而结束这一行跑到下一行…

C#开发可穿透代理服务器的WinForm

企业上网一般都是通过网关服务器&#xff0c;部分非自动的代理服务器需要手工设置(就像IE需要在连接-局域网设置-代理器中的那样)&#xff0c;前段为企业开发了一个需要远程访问HTTP服务器的应用&#xff0c;发现在手动代理的网络环境下&#xff0c;会在运行时WebRequest试图通…