Приложение занимает некоторое время для прослушивания входящих соединений

У меня есть приложение, которое использует 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 работать.

Другие вопросы по тегам