什么是获取外部IP地址的绝对最快方法?

时间:2016-07-31 19:34:58

标签: .net ip-address

我见过几种在.NET中检索外部IP地址的方法;我想知道的是,所有常见的变量都是相同的(互联网连接速度等),获取外部IP地址的最快代码是什么?

这是迄今为止我见过的最快的:

Private Function GetExternalIP() As String

Dim m As Match = Match.Empty

Try

    Dim wClient As New System.Net.WebClient
    Dim strURL As String = wClient.DownloadString("https://www.google.com/search?q=my+ip")
    Dim strPattern As String = "\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b"

    ' Look for the IP
     m = Regex.Match(strURL, strPattern)

Catch ex As Exception
    Debug.WriteLine(String.Format("GetExternalIP Error: {0}", ex.Message))
End Try

' Failed getting the IP
If m.Success = False Then Return "IP: N/A"

' Got the IP
Return m.value

End Function

我知道还有其他方法可以获取外部IP,即使用WebBrowser控件获取报告IP的页面,然后从结果中解析它,甚至是某些命令行方法,如摆弄:

nslookup myip.opendns.com. resolver1.opendns.com

有没有人花时间运行自己的测试来获得最快的方法?

1 个答案:

答案 0 :(得分:1)

很难对任何询问“最快方式”的问题给出绝对答案。此外,在这种情况下,问题不仅在于所使用的代码,还在于网络的延迟以及在有限时间内执行了多少次尝试。如果某些服务器看到很多此类请求来自同一地址,则可能会停止响应。 (DoS攻击来到minf)

然而,对您的代码稍作改进可能是尝试使用不同的服务来返回有关ip的裸机信息而不是其他许多不相关的信息

Dim wbc = New WebClient()
Dim externalIP = wbc.DownloadString("http://www.realip.info/api/p/realip.php")
externalIP = (New Regex("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")).
              Matches(externalIP)(0).ToString()

运行此代码100次会让我经过28秒,而您尝试使用谷歌会给我34秒。但正如我所说,你需要从你的位置进行测试。

修改
使用http://checkip.amazonaws.com,我们可以完全绕过正则表达式解析器并使用IPAddress类。现在循环(100次)似乎更快(再次,我认为它在很大程度上取决于服务器的响应时间)

Dim externalIP = wbc.DownloadString("http://checkip.amazonaws.com")
Dim ip = New IPAddress(externalIP.Split("."c).Select(Function(x) Convert.ToByte(x)).ToArray)