【发布时间】:2018-03-10 11:44:29
【问题描述】:
不是 powershell 专家,但在 Windows 10 的一个小项目中检查 IPv6 连接性。这(下面的代码)是我正在使用的,如果可能的话,我想继续使用它,因为它很快并且不涉及某个网站返回公共视图的 IPv6 地址。使用的远程 IPv6 地址 (2001:4860:4860::8888) 是 Google 公共 IPv6 DNS。我从一些代码中得到了这个想法,其中 Google Ipv6 DNS 服务器用于检查 Chrome 中的全局 Ipv6 连接性 > https://codereview.chromium.org/141023002
$Saddrf = [System.Net.Sockets.AddressFamily]::InterNetworkV6;
$Stypeg = [System.Net.Sockets.SocketType]::Dgram ;
$Ptypeg = [System.Net.Sockets.ProtocolType]::UDP ;
$Sockg = New-Object System.Net.Sockets.Socket($Saddrf, $Stypeg, $Ptypeg);
$Sockg.Connect('2001:4860:4860::8888', 53); $cnx = $Sockg.Connected;
write $cnx
它的问题是,即使在接口适配器上禁用了 IPv6 并禁用了 Teredo,当它不应该连接时,它仍然返回“True”(它已连接)。当接口适配器上没有启用 IPv6 或 IPv6 在防火墙或通过其他方式被阻止时,我希望它返回“False”。我做错了什么?
【问题讨论】:
-
粗略浏览一下 chromium 代码 sn-p 表明它实际上向 Google 公共 DNS 解析器发送了一个 DNS 数据包,只有在收到响应时才返回 true。上面的代码只创建了一个 udp6 套接字并停在那里。
-
一开始我也是这么想的,但是从我得到这个想法的地方阅读链接说“(请注意,由于检查,实际上没有发送任何数据包;UDP不需要发送任何要连接的数据包,并且 HostResolverImpl 不会通过套接字显式发送任何数据。)"
-
来自docs:
If you call Connect on a User Datagram Protocol (UDP) socket, the Connected property always returns true; however, this action does not change the inherent connectionless nature of UDP. -
啊哈!因此,如果它的 UDP 实际连接与否,它总是会返回 true。好吧,我想这可以回答这个问题。
标签: .net powershell udp