- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
只要“服务器”或应用程序在 Windows 和 .NET Framework 中运行,我已经拥有可以识别网络中设备 Mac 地址的工具。
我正在使用:
using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
namespace Tools
{
/// <summary>
/// Ferramentas para rede local
/// </summary>
public static class NET
{
private static string _erro;
public static string ErrorMessage { get { return _erro; } }
[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
/// <summary>
/// Recupera o MAC Address de um equipamento na rede local baseado em seu IP
/// </summary>
/// <param name="ip">IP em formato string (Ex: 192.168.0.10)</param>
/// <returns>String com o MAC Address no formato XX-XX-XX-XX-XX</returns>
public static string TryGetMacAddress(string ip)
{
try
{
IPAddress IP = IPAddress.Parse(ip);
byte[] macAddr = new byte[6];
uint macAddrLen = (uint)macAddr.Length;
if (SendARP((int)IP.Address, 0, macAddr, ref macAddrLen) != 0)
{
_erro = "Não foi possível executar comando ARP";
return String.Empty;
}
string[] str = new string[(int)macAddrLen];
for (int i = 0; i < macAddrLen; i++)
str[i] = macAddr[i].ToString("x2");
return string.Join("-", str);
}
catch (Exception e)
{
_erro = e.Message;
}
return String.Empty;
}
/// <summary>
/// Dado um ip que pertença ao equipamento, o MAC Address será dado
/// </summary>
/// <param name="ip">IP que pertença ao equipamento</param>
/// <returns>string com os bytes separados por hífen</returns>
public static string GetMyMacAddress(string ip)
{
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
foreach (UnicastIPAddressInformation unip in adapter.GetIPProperties().UnicastAddresses)
{
if (unip.Address.AddressFamily == AddressFamily.InterNetwork)
{
if (unip.Address.ToString() == ip)
{
PhysicalAddress address = adapter.GetPhysicalAddress();
return BitConverter.ToString(address.GetAddressBytes());
}
}
}
}
return null;
}
}
}
从机器本身获取 Mac-Address 的方法是使用 NetworkInterface .NET 类(在 GetMyMacAddress(string ip)
方法中使用)。要尝试从本地网络上的另一台设备获取 Mac-Address 是使用 arp 命令。
要在 Windows 中调用它,我必须导入系统 dll:[DllImport ("iphlpapi.dll", ExactSpelling = true)]
它引用:public static external int SendARP(int DestIP, int SrcIP, byte [] pMacAddr, ref uint PhyAddrLen);
并在这里使用它:SendARP ((int) IP.Address, 0, macAddr, ref macAddrLen)
当我移植 .NET Core 应用程序以在 Linux 上的 Raspberry PI 3 上运行时,我想知道如何在 Linux 上执行相同的过程(这是在该系统上执行此操作的正确方法吗?)。
NetworkInterface 类也存在于 .NET Core 中,位于 System.Net.NetworkInformation 命名空间下。
但是我如何从另一台机器的 IP 获取 Mac 地址(在具有 .NET Core 的 Linux 上)?
最佳答案
基于 https://pt.stackoverflow.com/a/250164/48585 ,我写了这个助手:
using System.Diagnostics;
///FOR LINUX
public static string Bash(string cmd)
{
var escapedArgs = cmd.Replace("\"", "\\\"");
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = $"-c \"{escapedArgs}\"",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return result;
}
///FOR WINDOWS
public static string CMD(string cmd)
{
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $@"/c {cmd}",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return result;
}
在询问 mac-address 之前 Ping class 进行测试
private static StringBuilder _erro = new StringBuilder();
public static string ErrorMessage { get { return _erro.ToString(); } }
public static bool Ping(string ipOrName, int timeout = 0, bool throwExceptionOnError = false)
{
bool p = false;
try
{
using (Ping ping = new Ping()) //using System.Net.NetworkInformation; (.NET Core namespace)
{
PingReply reply = null;
if (timeout > 0)
reply = ping.Send(ipOrName, timeout);
else
reply = ping.Send(ipOrName);
if (reply != null)
p = (reply.Status == IPStatus.Success);
//p = Convert.ToInt32(reply.RoundtripTime);
}
}
catch (PingException e)
{
_erro.Append(e.Message);
_erro.Append(Environment.NewLine);
if (throwExceptionOnError) throw e;
}
catch (Exception ex)
{
_erro.Append(ex.Message);
_erro.Append(Environment.NewLine);
}
return p;
}
然后,我使用这个工具:
public static string TryGetMacAddressOnLinux(string ip)
{
_erro.Clear();
if (!Ping(ip))
_erro.Append("Não foi possível testar a conectividade (ping) com o ip informado.\n");
string arp = $"arp -a {ip}";
string retorno = Bash(arp);
StringBuilder sb = new StringBuilder();
string pattern = @"(([a-f0-9]{2}:?){6})";
int i = 0;
foreach (Match m in Regex.Matches(retorno, pattern, RegexOptions.IgnoreCase))
{
if (i > 0)
sb.Append(";");
sb.Append(m.ToString());
i++;
}
return sb.ToString();
}
对于 Windows,只需将正则表达式模式更改为 (([a-f0-9]{2}-?){6})
并更改 string retorno = Bash(arp);
到 string retorno = CMD(arp);
或使用有问题的方法。我正在 Raspberry Pi3 上使用它。
关于c# - 如何使用 .Net Core 在 Linux 上从同一网络的远程计算机获取 mac 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46976238/
有没有办法在不进行提交/ check out 的情况下应用差异补丁或类似补丁? 我的情况:我工作时经常在计算机之间切换,我的提交历史记录有一堆“switching machines”消息。 我最初的猜
我的自定义引导加载程序中有代码从地址 0x8E00 处的 512 字节缓冲区复制内存。进入高内存,0x100000和更高。这在某些计算机上运行良好,而在其他计算机上崩溃(我假设是三重故障)。此代码在
服务器有没有办法将一些数据无线无缝地推送到客户端,可能是 Windows(电话)、iPhone、Mac 或 Android 设备,没有任何操作系统集成? 如果是这样,最好的设计模式是什么,最好的技术是
我无法理解hadoop的真正本质。 如果我有足够的资源来购买可以处理PB级数据的 super 计算机,那么为什么我需要Hadoop基础架构来管理如此大的数据? 最佳答案 hadoop的全部目的是能够在
我有一个奇怪的问题,或者我可能无法理解Grails i18n机制的工作原理。 我将以下内容插入到index.gsp文件中: LocaleContextHolder.locale:
我正在尝试为我的小弟弟编写一个简单的程序。他经常在他的电脑后面,但他应该为学校学习简单的算术 :D 我想制作以下程序: 他启动了他的电脑 他需要做一些简单的练习并完成 如果他做对了 x 次,他可以继续
有人能告诉我如何在 diff 主机(计算机)上为 MySQL 数据库做一个简单的数据库备份吗?我正在尝试将我的数据库从一台主机(服务器)移动到一台新主机(服务器) 最佳答案 如果您只是需要在服务器之间
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是无关紧要的,因
我正在尝试让 Android 应用程序使用 USB 电缆与运行 ubuntu 12.04 lts 的 Linux 计算机进行通信。我正在尝试使用 usbdeviceconnection 类,但是当我通
我刚刚使用 docker-toolbox 1.8.2 安装了 docker在 Windows 10 上。 由于由于this issue我不得不使用这些命令重新创建 docker 镜像 docker-m
如何删除处于 GURU_MEDITATION 错误状态的 VirtualBox 计算机?在 VirtualBox 未运行时删除该目录是否足够? 编辑:发布后,我删除了“在文件管理器中显示”导航到的整个
当我们在 Azure 机器学习服务中将模型部署为 ACIWebService 时,不需要指定任何 deployment_target。 根据AzureML documentation对于 azurem
当我们在 Azure 机器学习服务中将模型部署为 ACIWebService 时,不需要指定任何 deployment_target。 根据AzureML documentation对于 azurem
我遇到的主要问题是当我选择 stay 时会发生什么上hand_one ,然后 hit上hand_two . 而不是让我hit or stay上hand_two再次,它让我回到hit or stay上h
我知道我可以使用 putty 来 ssh 进入每台 Linux 机器并更新 CentOS 服务器...但我希望有人能够为我指明正确的方向,告诉我如何通过 PowerShell 或 Windows 中的
在 MIX 计算机中,一个单词由五个字节和一个符号组成。符号在内存中是如何表示的?是另一个字节,所以每个字真的是六个字节吗? 谢谢。 最佳答案 你的问题不是很清楚。体系结构规范未指定实际实现。它仅指定
我是 Python 的初级程序员,我的电脑有一个奇怪的问题。当我的计算机上有一个 .py 文件(包含一个有效的脚本)并双击它打开时,会发生以下情况:程序打开(它是黑屏 View ),但它会在一秒钟内自
我正在尝试在 Windows 上使用 plink 创建到 Linux 机器的隧道,并让转储文件最终出现在 Windows 机器上。看起来 this answer会工作,是我的问题的基础。但是尝试一下并
我想在 Windows 7 和 10 计算机上执行重启,但我首先需要将 Jenkins 节点暂时离线。在执行重启之前,我需要完成所有正在运行的任务。然后我远程登录到服务器并重新启动计算机。然而,在我重
我正在编写一个简单的程序,从 MySQL 数据库中提取计算机名称,然后将这些名称存储到字符串数组列表中(这部分工作正常)。之后,我编写了一个类和一个方法,将字符串作为参数(这将是计算机名称)并尝试对其
我是一名优秀的程序员,十分优秀!