Приложение занимает некоторое время для прослушивания входящих соединений
У меня есть приложение, которое использует hosts
файл для блокировки определенных сайтов. Веб-сайты не могут подключиться из-за hosts
файл, так что это прекрасно работает, однако моя программа должна вызывать событие, когда сайт заблокирован.
Я использую этот код:
Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim blocker As BlockListener
Dim thread As Thread
blocker = New BlockListener
thread = New Thread(New ThreadStart(AddressOf blocker.listen))
thread.Start()
AddHandler blocker.Blocked, AddressOf User_Blocked
End Sub
Private Sub User_Blocked()
My.Computer.Audio.Play("Sounds\Website-Blocked.wav")
WebsiteDetected.ShowDialog()
SetForegroundWindow(WebsiteDetected.Handle)
End Sub
Public Class BlockListener
Private port As Integer = 80
Private listener As TcpListener
Private BlockUsers As Boolean = True
Public Event Blocked As EventHandler
Public Sub listen()
listener = New TcpListener(IPAddress.Parse("127.0.0.1"), port)
listener.Start()
While (BlockUsers)
Dim clientConnection As TcpClient = listener.AcceptTcpClient
clientConnection.Close()
BlockUsers = False
RaiseEvent Blocked(Me, EventArgs.Empty)
End While
listener.Stop()
End Sub
После того, как я подожду некоторое время (скажем, около двух минут), программа сможет обнаружить плохие веб-сайты, которые посещают, однако я не очень хочу ждать, так как я думаю, что гораздо более практично, если вы просто запустите программу, и готово, вам не придется ждать, пока программа начнет прослушивать входящие соединения.
В любом случае я могу слушать на сервере быстрее?
Кроме того, это может быть потому, что у меня есть много сайтов в моем файле hosts? У меня есть в общей сложности 80000 зараженных веб-сайтов, и поскольку Visual Basic намного медленнее, чем некоторые другие языки, может ли это быть причиной?
1 ответ
Я не знаю почему TcpListener
требуется много времени, чтобы обнаружить соединение, но я могу подтвердить, что это происходит.
То, что, кажется, решает проблему, состоит в том, чтобы переключиться на HttpListener
вместо этого, который может использоваться для размещения реального HTTP-сервера.
Наконец, вам нужно выполнить звонок от User_Blocked
в поток пользовательского интерфейса, прежде чем вы можете начать открывать формы и доступ к элементам пользовательского интерфейса. Это потому что ваш Blocked
событие запускается в фоновом потоке, и весь код, связанный с пользовательским интерфейсом, должен выполняться только в потоке пользовательского интерфейса.
Private port As Integer = 80
Private listener As New HttpListener
Private BlockUsers As Boolean = True
Public Event Blocked As EventHandler
Public Sub listen()
listener.Start()
listener.Prefixes.Add("http://*:80/")
While (BlockUsers)
Dim context As HttpListenerContext = Listener.GetContext()
context.Response.Close()
BlockUsers = False
RaiseEvent Blocked(Me, EventArgs.Empty)
End While
listener.Close()
End Sub
В вашей форме:
Private Sub User_Blocked()
If Me.InvokeRequired Then 'Do we need to invoke or are we already on the UI thread?
Me.Invoke(New MethodInvoker(AddressOf User_Blocked))
Else 'We are on the UI thread.
My.Computer.Audio.Play("Sounds\Website-Blocked.wav")
WebsiteDetected.Show() 'Note that if you use ShowDialog(), the next line won't execute until the form has been closed.
SetForegroundWindow(WebsiteDetected.Handle)
End If
End Sub
ПРИМЕЧАНИЕ. Ваше приложение должно работать с правами администратора для
HttpListener
работать.