0

Hello.
I am developing an application and i needed for find if a certain IP:Port is online or not and keep updating it. At the moment i have it pinging the IP:Port every time a timer ticks, this works fine but every time it ticks, the application window freezes for a few seconds, which i don't want.
This is the code i have atm:

Imports System.Net
Imports System.Net.Sockets

Public Class MSSUI
    Dim h As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)
    Dim bBtnClicked As Boolean = False


    Private Sub IPbox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IPbox.TextChanged
    End Sub

    Private Sub MSSUI_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        IPbox.Text = h.AddressList.GetValue(0).ToString + ":27015"

    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If bBtnClicked = True Then
            Dim tcpClient As New TcpClient
            Dim IP As String = h.AddressList.GetValue(0).ToString
            Dim Port As Int32 = portbox.Text
            Dim IPAddress As IPAddress = IPAddress.Parse(IP)
            Try
                tcpClient.Connect(IP, Port)
                status1.Text = "Server Online"
            Catch err As Exception
                status1.Text = "No Server Online"
            End Try
        Else
            status1.Text = "No Server Online"
        End If
        bBtnClicked = True

    End Sub
End Class

(The +27015 on *h.AddressList.GetValue(0).ToString + ":27015"* is just to test the port)

Is there a better way to do it than this? all i want to do is find if the IP:Port is online or not and refresh the status. (with out having the application freeze)

Edited by Monster Killer: n/a

3
Contributors
6
Replies
8
Views
7 Years
Discussion Span
Last Post by wb-dieingfriend
0

If the actual checking works.
Then perhaps you should look into Threading instead of a Timer.

0

If the actual checking works.
Then perhaps you should look into Threading instead of a Timer.

Thanks for the suggestion. I'm not quite sure how to do that but i can look it up.

0

There are many methods to do this.
But here's how I do things.

' First add this in a new class file
Imports System.Threading

Public Class DoSomeThreading
   Private m_clsThread As Thread
   Private m_clsNotifyDelegate As NotifyProgress
   Private m_clsSynchronizationObject As System.ComponentModel.ISynchronizeInvoke

   Public Delegate Sub NotifyProgress(ByVal Message As String)

   Public Sub New(ByVal SynchronizationObject As System.ComponentModel.ISynchronizeInvoke, ByVal NotifyDelegate As NotifyProgress)
      m_clsSynchronizationObject = SynchronizationObject
      m_clsNotifyDelegate = NotifyDelegate
   End Sub

   Public Sub Start()
      m_clsThread = New Thread(AddressOf DoWork)
      m_clsThread.IsBackground = True 'Not sure if necessary
      m_clsThread.Start()
   End Sub

   Private Sub DoWork()
      Do While m_clsThread.IsAlive
         'Here you put the code for port scanning
         NotifyUI("status text")
         Thread.Sleep(5000) 'Pause the thread for 5 seconds
      Loop
   End Sub

   Private Sub NotifyUI(ByVal Message As String)
      If m_clsNotifyDelegate IsNot Nothing Then
         Dim args(0) As Object
         args(0) = Message
         m_clsSynchronizationObject.Invoke(m_clsNotifyDelegate, args)
      End If
   End Sub

   'Add some methods or properties to kill the thread.
End Class

' Then in your form
Public Class Form1
   Private Sub someButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles someButton.Click
      Dim threadClass As New DoSomeThreading(Me, New DoSomeThreading.NotifyProgress(AddressOf StatusReport))
      threadClass.Start()
   End Sub

   Private Sub StatusReport(ByVal Message As String)
      lblStatus.Text = Message
   End Sub
End Class

Edited by Oxiegen: n/a

0

Thanks. Tried it and it worked fine.
I managed to get this which works perfect.

Imports System.Threading

Public Class MSSUI
    Dim h As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)
    Dim bBtnClicked As Boolean = False
    Dim t As Thread
    Dim Port As Int32

    Private Sub start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles start.Click
        Port = portnumberbox.Text
        t = New Thread(AddressOf Me.BackgroundProcess)
        t.Start()
    End Sub

    Private Sub BackgroundProcess()
        Dim i As Integer = 1

        Do While True
            If bBtnClicked = True Then
                Dim tcpClient As New TcpClient
                Dim IP As String = h.AddressList.GetValue(0).ToString
                Dim IPAddress As IPAddress = IPAddress.Parse(IP)
                Try
                    tcpClient.Connect(IP, Port)
                    status1.Text = "Server Online"
                Catch err As Exception
                    status1.Text = "Server Not Online"
                End Try
            Else
                status1.Text = "Server Not Online"
            End If
            bBtnClicked = True
            i += 1
            Thread.Sleep(2000)
        Loop
    End Sub
End Class

That's the entire code that finds if the server is online or not in case anyone is interested. Thanks again for your help Oxiegen.

0

I'm working on a similar project, I've got everything threaded in a threadpool, run through thousands of IP addresses and it works fine. However I've noticed when the IP is not pingable it is skipped completely; the try/catch isn't grabbing it. I can't seem to find a solution to this, if anyone else has come across this issue before please let me know. Really appreciate it, thanks! -WB

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.