使用DNS 轻松获取主机信息
利用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"));
}
}
转载于:https://www.cnblogs.com/Fly-sky/archive/2008/08/18/1270315.html
使用DNS 轻松获取主机信息相关推荐
- Java面典_【Java实用工具】——使用oshi获取主机信息
最近在筹划做一个监控系统.其中就要获取主机信息,其中遇到一些问题.在此做个记录,以便以后查阅. 在该监控系统中,想要做到主机的CPU.内存.磁盘.网络.线程.JVM内存.JVM GC 等维度的监控,J ...
- shell获取主机信息并根据定时任务发送邮件到手机
** 获取主机信息相关shell命令,copy出去直接可用 ** #!/bin/bash ztday=`date +%Y%m%d%H%M` fileName="cpu_mem${ztday} ...
- java获取主机信息大全,网络编程:Java获取网络主机信息
java.net.InetAddress类表示互联网协议 (IP) 地址. 有两个子类:Inet4Address, Inet6Address 通过 InetAddress可以方便获取一个域名下的IP, ...
- Python获取主机信息、开机时间和开机时长、当前登陆用户
题目描述: 1.获取当前主机信息(操作系统名.主机名.内核版本.硬件架构) 2.获取开机时间和开机时长 3.获取当前登录用户 代码块: import os import psutil from dat ...
- psutil 模块获取主机信息
**## 一.简介** psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息 ...
- linux_sw_64,Zabbix使用system.sw.os获取主机信息
我们知道,Zabbix默认是可以获取到主机的相关信息,比如内核信息,那如何获取到系统版本呢,比如系统版本是"CentOS Linux 7" .通过查看官方文档(https://ww ...
- 从ASP.NET Core 3.1中的当前URL获取主机信息
目录 介绍 问题陈述 解决方案 介绍 在处理Web应用程序时,很自然,我们需要在产品生命周期的各个阶段在各种环境(即开发,测试,生产等)之间切换.换句话说,所有这些环境可能具有不同的主机地址.让我们来 ...
- python调用zabbixapi接口_python调用zabbix api获取主机信息
import requests import json headers = { 'Content-Type': 'application/json' } class GetZabbix: def __ ...
- 如何通过域名获取主机ip地址
如何通过域名获取主机ip地址 需要注意,主机不是本机,一般指服务器与客户端.主机信息主要包含ip地址和对应的域名.linux使用结构体struct hostent表示主机的信息.struct host ...
最新文章
- linux脚本做分数计算,shell脚本,计算学生分数的题目。
- javascript:正则表达式、一个表单验证的例子
- docker镜像、容器管理
- js ==与===区别(两个等号与三个等号)
- Wannafly挑战赛29题解
- ora-01033:oracle initializationg or shutdown in progress
- 信息系统项目管理师案例考试汇总(2005~2021年)
- 主程序分析法MATLAB编程,专题五 概率统计问题的Matlab求解
- C#语言之“中英文混合字符串对齐”的方法
- Bootstrap导航栏注释
- 【算法】栈实现综合表达式计算
- linux下scrapy安装教程,linux centos7安装scrapy
- 【辨异】 —— 带宽与宽带
- 在blog中放置北京奥运倒计时Flash
- 最近朋友圈很火,有关全网vip影视自助建站系统是真的吗?靠谱吗?
- 第三方app实现微信登录功能
- java 计算两点间的距离_java计算两点间的距离的两种方法
- 创业反鸡汤--3.谈待遇
- Android Studio如何连接手机设备
- 【JSP笔记02】JSP注释、脚本、表达式、JSP三大指令、JSP七大动作的介绍及使用
热门文章
- 小程序中input标签没有反应_鸢尾花预测:如何创建机器学习Web应用程序?
- scrapy 分布式 mysql_Scrapy基于scrapy_redis实现分布式爬虫部署的示例
- linux xorg.0.log,Red Hat无法登录,Cannot open log file /var/log/Xorg.0.log
- mysql最大值最小值_mysql最大值,最小值,总和查询与计数查询
- Linux 性能检查命令总结
- Java线程面试题 Top 53
- 腾讯校招历年经典面试汇总:C++研发岗
- leetcode516 最长回文子序列
- Java内存模型常见问题
- Redis:10---List对象