在C#中确定下一跳MAC地址

时间:2009-08-26 09:11:14

标签: c# networking mac-address

我正在编写一个使用SharpPcap注入数据包的应用程序。

但是,由于我自己构建数据包并且只知道目的地的IP地址,因此我必须确定下一跳的物理地址。我总是可以向远程IP address发送ping,嗅探它,并从嗅探包中获取MAC address。但是,我希望在C#中有一种不太复杂的方式。

显然,获取下一跳的IP地址也非常有用,因为我可以使用SendArp来确定其MAC地址。

获取路由表即可。我如何使用代码获得它?

3 个答案:

答案 0 :(得分:2)

我遇到了一些WMI问题(似乎无法将Win32_IP4RouteTable中的接口索引与实际设备关联起来; MSDN文档错误,而某些计算机上的其他更多hackish技术失败)。

所以,我选择使用非托管GetBestRoute,这实际上节省了我很多时间,因为它让Windows自己做出路由决定,并返回下一跳的IP地址和导致那个地址。它比对WMI运行查询要快得多。

然后,您可以通过在GetAdaptersInfo返回的列表中查找该标识符来查找NIC本身。

希望它有所帮助...

答案 1 :(得分:0)

物理地址由Address Resolution Protocol解决 - 只需发送 ARP Reuest 并使用要解析的IP地址。

如果目标不在本地网络中,则必须将数据包发送到标准网关,并且必须为标准网关执行ARP请求。可以使用System.Net.NetworkInformation命名空间中的方法获取标准网关。

 NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses

答案 2 :(得分:0)

执行此操作的完全hackish方式是运行命令“arp -a”并读取和解析命令的结果(使用Windows已经拥有的ARP缓存)。

否则,您需要在协议栈中包含ARP。这就是您的系统本身如何工作以确定发送帧的位置。或者最后,如果您不担心效率低下,可以将以太网目的地设置为:FF:FF:FF:FF:FF:FF并将所有人放在与您相同的LAN上。当某些内容响应或您收到数据包时,请自行缓存以获得正确的目标MAC地址。

就个人而言,如果你在我的网络上遇到了洪水,我会伤到你,但根据你的情况,这可能是一个相当容易的黑客攻击。但是,执行100%完整堆栈实现相当复杂,因为有很多边缘情况应该得到很好的支持(例如处理代理ARP,免费ARP等)。