Portscanner.. zu lahm

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Portscanner.. zu lahm

    Hallo VB

    ich habe einen Portscanner gebastelt, der geht eig. auch aber er ist viel zu langsam. normalerweise sollte der ja fast jede Sekunde einen Port scannen und melden. doch hier brauche ich fast 10-15 sec dafür.

    könntet ihr mir eventuell sagen wo ich den Fehler gemacht habe.

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Threading
    3. Imports System.Net
    4. Imports System.IO
    5. Public Class Form1
    6. Private Sub ports_checken()
    7. Dim aktueller_port As Integer
    8. Dim end_port As Integer = NumericUpDown2.Value
    9. For aktueller_port = NumericUpDown1.Value To end_port
    10. Dim client As New TcpClient
    11. Try
    12. client.Connect(TextBox1.Text, aktueller_port)
    13. ListView1.Items.Add(aktueller_port.ToString)
    14. Catch ex As Exception
    15. End Try
    16. Label5.Text = "aktueller Port: " & aktueller_port
    17. Next
    18. MessageBox.Show("alle Ports wurden gescannt")
    19. End Sub
    20. Dim main_thread As New Thread(AddressOf ports_checken)
    21. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    22. ListView1.Items.Clear()
    23. main_thread = New Thread(AddressOf ports_checken)
    24. main_thread.IsBackground = True
    25. main_thread.Start()
    26. Control.CheckForIllegalCrossThreadCalls = False
    27. End Sub
    28. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    29. main_thread.Abort()
    30. End Sub
    31. End Class


    mfg

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Samus Aran schrieb:

    VB.NET-Quellcode

    1. Control.CheckForIllegalCrossThreadCalls = False

    Das ist der Fehler. Nimm die Codezeile weg und lerne, richtig mit Threads umzugehen.


    naja, aber wen ich dies weg mache kann ich nicht mehr mit der Form kommunizieren.. sprich das mir das Label5 einen wert ausgibt nach jeder schleife.
    Doch, kannst du. Wenn du's ordentlich machst:

    VB.NET-Quellcode

    1. Invoke(Sub()
    2. Label5.Text = "aktueller Port: " & aktueller_port.ToString()
    3. End Sub)
    Danke,

    dies geht nun.

    doch habe ich das "Problem" das der client ewigs braucht um zu verbinden.

    VB.NET-Quellcode

    1. For aktueller_port = NumericUpDown1.Value To end_port
    2. Dim client As New TcpClient
    3. Try
    4. client.Connect(TextBox1.Text, aktueller_port)
    5. ListView1.Items.Add(aktueller_port.ToString)
    6. Catch ex As Exception
    7. End Try
    8. Invoke(Sub()
    9. Label5.Text = "aktueller Port: " & aktueller_port.ToString()
    10. End Sub)
    11. Next


    wen ich nun "client.Connect(TextBox1.Text, aktueller_port)" ausschalte 'client.Connect(TextBox1.Text, aktueller_port) dann sehe ich die Ports angezeigt im label5
    Ich denke mal, da kommt eine exception, von der Du nichts merkst.
    Nimm also das Try / Catch / End Try ganz raus oder pack Dir in den Catch-Zweig eine MessageBox, die Dir die Exception-Info ausgibt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    du hast recht, so sieht es aus wen ich den try block weg mache.

    allerdings ist dies immernoch mit deaktiviertem client.connect





    Dies habe ich nun auch in ein Invoke(Sub() gemacht und es geht prima.

    nun hab ich noch den Fehler mit dem Clienten:

    Genau das musst Du mit Invoke() machen, kommt bereits in mehreren Posts vor.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Auch wenn du's nicht verstehst, das ganze viel zu hoch für dich (noch) ist und du bei Fehlern nicht weiterkommst:

    EDIT:
    Etwas aufgehübscht mit ner Progressbar und den Test selber auch noch in Async gewrappt ...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Threading.Tasks
    2. Imports AsyncCtpExtensions
    3. ''' <summary>
    4. ''' Simple Async Sample.
    5. ''' Need Controls:
    6. ''' Button: btnStart
    7. ''' Label: lblTime
    8. ''' Listbox: lstResults
    9. ''' Progressbar: pbCurrentWork
    10. ''' </summary>
    11. ''' <remarks></remarks>
    12. Public Class Form1
    13. Private WithEvents tmalive As New Timer With {.Interval = 250, .Enabled = False}
    14. Private Sub Form1_Activated(sender As Object, e As System.EventArgs) Handles Me.Activated
    15. tmalive.Enabled = True
    16. End Sub
    17. Private Async Function Test(ByVal ip As String, ByVal startport As Integer, ByVal endport As Integer) As Task
    18. pbCurrentWork.Value = 0
    19. pbCurrentWork.Maximum = endport - startport
    20. Dim stp As Stopwatch = Stopwatch.StartNew
    21. Dim l As New List(Of Task(Of String))
    22. Dim tf As New TaskFactory(Of String)
    23. For i = startport To endport
    24. Dim p As Integer = i
    25. l.Add(tf.StartNew(Function() As String
    26. Dim result As String = p.ToString & " FAIL"
    27. Try
    28. Using t As New Net.Sockets.TcpClient
    29. t.Connect(Net.IPAddress.Parse(ip), p)
    30. result = p.ToString & " SUCCESS"
    31. t.Close()
    32. End Using
    33. Catch
    34. ' fall through
    35. End Try
    36. Return result
    37. End Function))
    38. Next
    39. While l.Count > 0
    40. Dim ts As Task(Of String) = Await TaskEx.WhenAny(l)
    41. pbCurrentWork.Increment(1)
    42. If ts.Result.Contains("SUCCESS") Then
    43. lstResults.Items.Add(ts.Result)
    44. End If
    45. l.Remove(ts)
    46. End While
    47. stp.Stop()
    48. lstResults.Items.Add("done all in " & stp.ElapsedMilliseconds.ToString & " milliseconds")
    49. End Function
    50. Private Async Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click
    51. ' make sure we do not overlap
    52. Static testing As Boolean = False
    53. If testing Then Exit Sub
    54. testing = True
    55. Await Test("127.0.0.1", 50, 300)
    56. testing = False
    57. End Sub
    58. Private Sub tmalive_Tick(sender As Object, e As System.EventArgs) Handles tmalive.Tick
    59. ' just to show, that GUI events are still processed
    60. Dim s As String = Now.ToString
    61. If lblTime.Text <> s Then lblTime.Text = s
    62. End Sub
    63. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „picoflop“ ()