【问题标题】:How to convert IP address into MAC address byte array?如何将IP地址转换为MAC地址字节数组?
【发布时间】:2012-01-19 15:12:55
【问题描述】:

我正在尝试将 IP 地址转换为 MAC 地址,然后将其转换为字节数组。我被困在第一部分,不知道该怎么做。我看到一些搜索结果在谈论System.Net.NetworkInformation.NetworkInterface,但不知道如何使用它。

这是我需要 MAC 字节数组的代码。如何做到这一点?

[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);

private void Ping(IPAddress address)
{
    byte[] macAddr = new byte[6];
    uint macAddrLen = uint.Parse(macAddr.Length.ToString());

    if (SendARP(int.Parse(address.ToString()), 0, macAddr, ref macAddrLen) == 0)
    {
        //SUCCESS!
    }
}

【问题讨论】:

  • 你想做什么? MAC地址无法访问,除了在主机上,所以我不明白你的问题
  • @CharlesB,我正在努力让this 工作。问题是我最后一个变量 macAddrLen 没有赋值。
  • 适配器的MAC地址只能在同一网段使用。不在路由器的另一边。

标签: c# winforms bytearray mac-address arp


【解决方案1】:

了解您尝试做的事情。类似于将您的电话号码翻译成街道名称 - 它们之间没有关联。

MAC 地址在以太网级驱动程序中编码,而 IP 地址是 IP 协议更高层的人工构造。他们的关系为零。路由器通过协议(ARP - 地址解析协议)找到发送 IP 数据包的 MAC 地址,这不能跨网段。

【讨论】:

  • 解释得很清楚。好的,所以我一直在以错误的方式看待它。 +1。
【解决方案2】:

看看here:

byte[] macAddr = new byte[6];
uint macAddrLen = (uint) macAddr.Length;
if (SendARP((int)address.Address, 0, macAddr, ref macAddrLen) != 0)
    throw new InvalidOperationException("SendARP failed.");

string[] str = new string[(int)macAddrLen];
for (int i = 0; i < macAddrLen; i++)
    str[i] = macAddr[i].ToString("x2");

Console.WriteLine(string.Join(":", str));

【讨论】:

  • 我正在尝试此代码,但与我的代码相同,它在 if 语句行导致错误:输入字符串的格式不正确。你知道这是为什么吗?
  • @HelpNeeder 请查看我的编辑。错误在于对 int.Parse 的调用(将地址转换为字符串将返回格式为“x.x.x.x”的 IP,无法转换为 int)
  • 代码不起作用,因为您试图将 IP 转换为字符串,然后将其解析为 int -> int.Parse(address.ToString())。要使代码正常工作,您需要一个 IPaddress 对象,然后像这样使用它: (int)YourIPObject.Address
  • @R34lthing, int.Parse(address.Address) 并没有完全消除它。我需要 int.Parse(address.Address.ToString()) 所以它甚至可以编译。现在的问题是我的地址范围从 255.255.255.0 到 255.255.255.127,然后我收到一个错误:对于 Int32 而言,值太大或太小。
  • 没关系。我已经解决了将我的第一个参数的类型更改为字符串的问题。
【解决方案3】:

实际上 MAC 地址是给你的。您不需要知道计算机的 MAC 地址。 macAddr 将在您调用函数 SendARP 后保存 MAC 地址。

MSDN documentation 中,您可以看到参数 macAddr 和 macAddrLen 被标记为 [out],这意味着函数使用此参数返回值。

Address Resolution Protocol 的全部意义在于您可以将网络层地址 (IP) 解析为物理地址 (MAC)

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2011-02-25
    • 2012-09-14
    相关资源
    最近更新 更多