我想编写一个检查我的ip的函数。如果我的IP是22.161.121.238
或者检查给了Exception
,它会睡眠当前线程并再次开始检查。
这就是代码:
Private Sub CheckIp()
Dim ip As String
Dim mine As String = "22.161.121.238"
Try
Do
Using wc As New Net.WebClient
ip = System.Text.Encoding.UTF8.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php"))
End Using
If String.Equals(ip, mine) Then
MessageBox.Show("2")
Threading.Thread.Sleep(10000)
Else
MessageBox.Show("@" & ip & "@ is not equal to @" & mine & "@")
End If
End If
Loop While ip = "22.161.121.238"
Catch ex As Exception
Threading.Thread.Sleep(10000)
CheckIp()
End Try
End Sub
我不知道为什么它没有显示MessageBox
中的“2”。即使ip
和mine
相同,也不会启动Show
方法。你能告诉我为什么吗?
启动按钮后我得到的是(我添加@
以查看字符串的开始位置):
答案 0 :(得分:3)
简单的答案是你的2个字符串不相同。它们可能看起来相同,但您从网络资源返回的字符串包含字符串开头的 不可见 Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF)(我已检查过)
要确认,请检查返回字符串的各个字符的数值,特别是第一个字符。
作为一种解决方法,您可以使用@ henry的答案,该答案使用不同的方式比较字符串,这将忽略u+feff
字符。
或者,您可以显式删除它以进行相等性检查:
If String.Equals(ip.Replace(ChrW(&HFEFF), String.Empty), mine) Then
但是,如果您是PHP页面的作者,您可能想要修复它,以便它首先不返回u+feff
字符。
答案 1 :(得分:-1)
试试这个函数,原始函数中有一些if / then逻辑是不正确的。
Private Sub CheckIp()
Dim ip As String
Dim mine As String = "22.161.121.238"
Try
Do
Using wc As New Net.WebClient
ip = System.Text.Encoding.UTF8.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php"))
End Using
If string.Compare(ip, mine) = 0 Then
MessageBox.Show("2")
Threading.Thread.Sleep(10000)
Else
MessageBox.Show("@" & ip & "@ is not equal to @" & mine & "@")
End If
Loop While ip.Contains("22.161.121.238")
Catch ex As Exception
Threading.Thread.Sleep(10000)
CheckIp()
End Try
End Sub