c# - 如何仅 Ping IPv4?
问题描述
我知道我的路由器的 IPv4 地址。但是当我使用 TTL = 1 进行 Ping 时,我没有得到那个 IP。相反,我得到了它的 IPv6 地址。(我知道,address.MapToIPv4()
但这仅适用于已更改为 IPv6 的 IPv4。)
那么我如何仅 ping IPv4(如tracert 的 /4 开关)?
var reply = new Ping().Send("example.com", 10000, new byte[] { 1 }, new PingOptions(1, true));
解决方案
查看源代码(参考源,GitHub),如果传递给的参数Send()
是名称,则Dns.GetHostAddresses()
用于解析它,返回的第一个地址就是使用的地址。因此,如果第一个地址是 IPv6 地址,那么该地址就是将被 ping 的地址,并且无法更改该行为。
相反,您可以调用Dns.GetHostAddresses()
自己,过滤结果以包含或首选 IPv4 地址,然后将其传递给Ping.Send()
:
IPAddress addressToPing = Dns.GetHostAddresses("example.com")
.First(address => address.AddressFamily == AddressFamily.InterNetwork);
using (Ping ping = new Ping())
{
PingReply reply = ping.Send(addressToPing, 10000, new byte[] { 1 }, new PingOptions(1, true));
// Do something with reply...
}
推荐阅读
- .htaccess - .htaccess 重定向循环与 RewriteCond
- c# - 当我尝试提交表单以将一些值和上传图像的路径存储到数据库中时,我收到一个错误,因为 [未设置对象引用 ....]
- reportlab - 从 ReportLab 中的表格行中删除圆角边框
- java - EndPoint 类中的 Spring WS SOAP 响应头修改
- mysql - 从表中删除记录取决于其他表值
- ionic-framework - Ionic 4 中的 CSS 变量
- reactjs - 如何访问 getDerivedStateFromProps 中的组件函数
- openpai - 概念Job和Framework的区别和关系
- cesium - 在 cesium 中,如何随时间动态更新标签?
- elixir - 翻译erlang的记录器事件时失败