Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定C中的下一跳MAC地址#_C#_Networking_Mac Address - Fatal编程技术网

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

C# 确定C中的下一跳MAC地址#,c#,networking,mac-address,C#,Networking,Mac Address,我正在编写一个应用程序,它使用 但是,由于我自己构造数据包,并且只知道目的地的IP地址,因此我必须确定下一跳的物理地址。我总是可以向远程发送ping,嗅探它,并从嗅探到的数据包中获取消息。然而,我希望有一个不那么复杂的方式来做到这一点 显然,获取下一跳的IP地址也将非常有用,因为我可以使用SendArp来确定它的MAC地址 获取路由表就可以了。如何使用代码获得该地址?物理地址由-只需发送一个带有要解析的IP地址的ARP请求即可解析 如果目的地不在本地网络中,则必须将数据包发送到标准网关,并且必须

我正在编写一个应用程序,它使用

但是,由于我自己构造数据包,并且只知道目的地的IP地址,因此我必须确定下一跳的物理地址。我总是可以向远程发送ping,嗅探它,并从嗅探到的数据包中获取消息。然而,我希望有一个不那么复杂的方式来做到这一点

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


获取路由表就可以了。如何使用代码获得该地址?

物理地址由-只需发送一个带有要解析的IP地址的ARP请求即可解析

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

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

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

否则,您需要在协议栈中包含ARP。这就是您的系统本身的工作方式,以确定在何处发送帧。最后,如果您不担心效率低下,您可以将以太网目的地设置为:FF:FF:FF:FF:FF:FF,并使同一LAN上的所有人都与您共享。当有东西响应或您收到一个数据包时,请自己缓存它以获得正确的目标MAC地址


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

我在WMI方面遇到了一些问题(似乎无法将Win32_IP4RouteTable中的接口索引与实际设备相关联;MSDN文档是错误的,其他更黑客的技术在某些计算机上失败)

因此,我选择使用非托管,这实际上节省了我很多时间,因为它让Windows自己做路由决定,并返回下一个跃点的IP地址和指向该地址的NIC标识符。它也比对WMI运行查询快得多

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


希望它有帮助…

如果目标机器在我的lan上,这是正确的。您如何确定到远程机器的路由中的第一个网关(及其mac地址)(在代码中,而不是使用traceroute)只需获取计算机的默认网关。可在System.Net.NetworkInformation命名空间中找到此方法。如果存在通过默认网关以外的其他网关路由的一组网络地址,会发生什么情况?是否有方法访问路由表并查询它?假设我调用“arp-a”。我如何确定路由中下一个网关的ip地址,比如74.125.43.104(google.com)?我知道您已经找到了一个可行的解决方案,但是您还需要查看绑定到哪个接口的路由表,并确定默认网关是什么。我认为默认网关会自动添加为一个路由条目,目标为0.0.0.0,掩码为0.0.0.0,因此我应该在扫描路由选项卡时检查它们乐