Electro_Attacks Ответов: 1

Как я могу исправить свою петлю for?


Эй, ребята, у меня есть Порблем с моими передними петлями... в заданном диапазоне, например 197.232.178.0 - 255.255.255.255, мои циклы for начинают пропускать шаги... Результаты в DGV начинают показывать только 197.242.186.0, и похоже, что все остальные IP-адреса были просто пропущены...
Я понятия не имею, где именно происходит сбой...
Приведенный ниже код является целой функцией и берет все не объявленные vars из общедоступных vars, которые были установлены в других субподрядах.


Private Sub NwS_BackgroundWorker_DoWork() Handles NwS_BackgroundWorker.DoWork
    Dim NwS_StartSplit = Split(NwS_StartIP, ".")
    Dim NwS_EndSplit = Split(NwS_EndIP, ".")
    Dim NwS_IPExport

    For A As Int64 = NwS_StartSplit(0) To NwS_EndSplit(0)
        For B As Int64 = NwS_StartSplit(1) To NwS_EndSplit(1)
            For C As Int64 = NwS_StartSplit(2) To NwS_EndSplit(2)
                For D As Int64 = NwS_StartSplit(3) To NwS_EndSplit(3)
                    ' Preparing New Thread
                    NwS_ThreadCount += 1
                    NwS_IPExport = A & "." & B & "." & C & "." & D

                    ' Creating and starting new backgroundthread
                    Dim oThread As New Thread(AddressOf Me.NwS_BackgroundPing)
                    oThread.IsBackground = True
                    oThread.Start(NwS_IPExport)

                    If NwS_BackgroundWorker.CancellationPending = True Then
                        Exit For
                    End If
                Next

                ' Handbrake for decreasing CPU Usage
                While NwS_ThreadList.Count > 0 And NwS_Handbrake = True
                    If NwS_BackgroundWorker.CancellationPending = True Then
                        Exit For
                    End If
                End While
            Next
        Next
    Next

End Sub

Private Sub NwS_BackgroundPing(ByVal NwS_IPExport)
    ' Report the Working State to the ThreadList
    Dim Thread_Name As String = "Thread: " & NwS_ThreadCount
    NwS_ThreadList.Add(Thread_Name)

    ' Set NetworkScan Variabless for Ping Request
    Dim NwS_StatusImage As String = " "
    Dim NwS_StatusString As String = " "
    Dim NwS_HostName As String
    Dim NwS_MacImport As String
    Dim NwS_MacAddress As String

    Dim Result As Net.NetworkInformation.PingReply
    Dim SendPing As New Net.NetworkInformation.Ping

    ' Try to send Ping Request and resolve Hostname & Mac Address
    Try
        Result = SendPing.Send(NwS_IPExport, 120)
        If Result.Status = Net.NetworkInformation.IPStatus.Success Then
            NwS_StatusImage = "C:\Users\Electro_Attacks\Desktop\VB Projekt\pc.png"
            NwS_StatusString = "Used"
            NwS_HostName = System.Net.Dns.GetHostEntry(NwS_IPExport).HostName


            Dim ip = System.Net.IPAddress.Parse(NwS_IPExport)
            Dim arp = New ArpRequest(ip)
            NwS_MacImport = arp.GetResponse().ToString()
            If NwS_MacImport <> Nothing Then
                NwS_MacAddress = Regex.Replace(NwS_MacImport, "(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})", "$1:$2:$3:$4:$5:$6")
            End If
        Else
            NwS_StatusImage = "C:\Users\Electro_Attacks\Desktop\VB Projekt\No PC.png"
            NwS_StatusString = "Free"
            NwS_HostName = ""

        End If

        ' Catching all exceptions
    Catch ex As Exception
        If NwS_StatusImage = " " Then
            NwS_StatusImage = "C:\Users\Electro_Attacks\Desktop\VB Projekt\No PC.png"
        End If
        If NwS_StatusString = " " Then
            NwS_StatusString = "Unknown"
        End If
    End Try
    ' Add results to Datagrid and remove Thread from List
    Me.Invoke(New MethodInvoker(Sub() DataGridView1.Rows.Add(Image.FromFile(NwS_StatusImage), NwS_IPExport, NwS_HostName, NwS_MacAddress, NwS_StatusString)))

    ' CleanUP
    NwS_StatusImage = ""
    NwS_StatusString = ""
    NwS_HostName = ""
    NwS_MacImport = ""
    NwS_MacAddress = ""
    NwS_ThreadList.Remove(Thread_Name)
    Threading.Thread.CurrentThread.Abort()
End Sub



Что я уже пробовал:

Я уже пробовал разные диапазоны, сбой появляется около 192.168.(182-190).0 и приводит мой wohle UI в невосприимчивость. Даже точка остановки отладки не может перехватить цикл for, как только он достигнет этой точки...

1 Ответов

Рейтинг:
12

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
Private Function Double(ByVal value As Integer) As Integer
    Return value * value
End Function

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


[no name]

Да, я уже пробовал это, как сотни раз, но не до такой степени... И я уже пробовал отлаживать первый цикл for с точкой останова, установленной прямо на нем. И когда я запускаю цикл for с этими сломанными числами, код просто идет и идет и игнорирует точку останова... Поэтому я спрашиваю экспертов здесь: есть ли большая ошибка в моем цикле for или это часть Ping Try Ping, которая решила убить все мои потоки вместо того, чтобы печатать хотя бы IP-адреса

[no name]

Вау, теперь я нашел его... Чувак, ты просто потрясающий! Это была чертова функция остановки... Когда вы нажимаете стоп, останавливается только блок D gots, но ни ручной тормоз, ни точка останова не могут помочь, когда последняя и самая важная часть будет отменена....

У вас есть совет, как я могу сделать свой пользовательский интерфейс немного менее отстающим? Я хочу, чтобы мое сканирование было как можно быстрее, но пользовательский интерфейс не должен замерзать во время сканирования...

OriginalGriff

Переместить сканирование в другой поток было хорошей идеей, но вы, похоже, делаете изрядный объем работы с помощью Invoke, который толкает выполнение обратно в поток пользовательского интерфейса. Сделайте всю работу, которую вы можете (включая загрузку изображений) в своем рабочем устройстве, и передайте готовые данные обратно в основной поток через отчет о ходе выполнения (возможно, в пакетах, если вы можете уменьшить количество добавлений строк)
Если вы используете много потоков, то вы будете забивать поток пользовательского интерфейса обновлениями, и это не будет быстро.

Трудно сказать, не зная остального кода, но попробуйте просто закомментировать вызов и запихнуть результаты в коллекцию на потом, чтобы посмотреть, насколько это улучшит ситуацию.

[no name]

Ok, I was working on it now for days, but I don't find an elegant solution... This is my first VB Project and my Code is based on my Batch IP Scanner... Sooo in my Batch scanner I was doing all the Scans in a new Window with the only job to do the ping and save the result in a teamp file... After the Scan was finished I was loading all temp files (the names were the IP and the content was the hostname)... That was all just too slow... My VB Code is 10x faster than the Batch version... But I can't implement a method to make the UI thread less hammered down... And also I'm still missing a proper way to make a good handbrake for decreasing System Ressources...

У вас есть какие-нибудь идеи или советы, как я могу решить свои проблемы? Выполнение Datagrid с событием ReportProgress было еще хуже, чем Invoke :/