Определение FTP-серверов в сети

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Определение FTP-серверов в сети

Сообщение Лохматый » 07.12.2005 (Ср) 18:07

Как можно пределить ftp-серверы в сети? Я попробовал сделать так:
форма имеет listbox и button

Код: Выделить всё

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim a As Integer
        For a = 1 To 255
            Dim so As New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
            Try
                so.Connect("192.168.5." & a, 21)
                If Not so.Connected Then
                    Me.ListBox1.Items.Add("Нет")
                Else
                    Me.ListBox1.Items.Add("Есть")
                End If
            Catch ex As Exception
                Me.ListBox1.Items.Add("Нет")
            End Try
            Application.DoEvents()
        Next
    End Sub


Результат не самый лучший... :( Скорость определения очень низкая.
Может есть другой способ? Если да - то какой?

Спасибо!

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 07.12.2005 (Ср) 19:48

Ну раз уж в цикле делаешь, то используй несколько потоков. Будет гораздо быстрее и правильнее - те же сетевые сканеры работают в несколько потоков.
Смотри System.Threading

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Сообщение Лохматый » 07.12.2005 (Ср) 20:12

Спасибо! Пробовал и в разных местах выскакивали ошибки... как правильно сделать потоки к данному примеру?

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Сообщение Лохматый » 07.12.2005 (Ср) 20:15

Спасибо! Пробовал и в разных местах выскакивали ошибки... как правильно сделать потоки к данному примеру?

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Сообщение Лохматый » 08.12.2005 (Чт) 19:02

Прошлый пример, но теперь с потоками (корявыми), в чем ошибка не пойму..

Код: Выделить всё
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim a As Integer
        For a = 1 To 255
            Dim m As New Threading.Thread(AddressOf f)
            m.Start(a)
        Next
    End Sub
    Private Sub f(ByVal a)
        Dim so As New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
        Try
            so.Connect("192.168.5." & a, 21)
            If Not so.Connected Then
                Me.ListBox1.Items.Add("Нет")
            Else
                Me.ListBox1.Items.Add("Есть") ' Или сдесь, если комп ответил
            End If
        Catch ex As Exception
            Me.ListBox1.Items.Add("Нет") ' Здесь ошибка
        End Try
    End Sub


Cross-thread operation not valid: Control 'ListBox1' accessed from a thread other than the thread it was created on

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Сообщение Лохматый » 08.12.2005 (Чт) 19:03

Прошлый пример, но теперь с потоками (корявыми), в чем ошибка не пойму..

Код: Выделить всё
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim a As Integer
        For a = 1 To 255
            Dim m As New Threading.Thread(AddressOf f)
            m.Start(a)
        Next
    End Sub
    Private Sub f(ByVal a)
        Dim so As New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
        Try
            so.Connect("192.168.5." & a, 21)
            If Not so.Connected Then
                Me.ListBox1.Items.Add("Нет")
            Else
                Me.ListBox1.Items.Add("Есть") ' Или сдесь, если комп ответил
            End If
        Catch ex As Exception
            Me.ListBox1.Items.Add("Нет") ' Здесь оибка
        End Try
    End Sub


Cross-thread operation not valid: Control 'ListBox1' accessed from a thread other than the thread it was created on

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Сообщение Лохматый » 08.12.2005 (Чт) 21:49

Почти разобрался так вот всё работает, но...

Код: Выделить всё

Public Class Form1

   

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim a As Integer

        For a = 1 To 255
            Dim t As New Class1
            Dim i As New Threading.Thread(AddressOf t.s)
            i.Start(a)
        Next
    End Sub

End Class


Код: Выделить всё

Public Class Class1

    Public Sub s(ByVal a)

        Dim so As New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)

        Try
            so.Connect("192.168.5." & a.ToString, 21)

            If Not so.Connected Then
                Form1.ListBox1.Items.Add("Нет")
            Else
                Form1.ListBox1.Items.Add("Да")
            End If
        Catch
            Form1.ListBox1.Items.Add("Нет")
        End Try
    End Sub
End Class


Вот только результат в listbox не появляется, а если заменить

Код: Выделить всё
Form1.Listbox1.Items.Add("Нет")

на
Код: Выделить всё
Console.WriteLine("Нет")

тогда всё работает.
В чем сдесь дело?

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 08.12.2005 (Чт) 22:28

Public MySubnet(254) as Boolean

Туда клади результат трудов. Потом уже читай его и выводи на листбокс.

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Сообщение Лохматый » 09.12.2005 (Пт) 2:05

Vinechka писал(а):Public MySubnet(254) as Boolean

Туда клади результат трудов. Потом уже читай его и выводи на листбокс.

А подругому ни как? Нужно уведомлять пользователя результатами в процессе выполнения а не после него. Его продолжительность примерно 20 сек.

Лохматый
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 19.06.2005 (Вс) 16:36
Откуда: Краснодар

Сообщение Лохматый » 09.12.2005 (Пт) 18:36

Так что, передать параметр из потока в основную форму нельзя?

Klinifini
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.08.2006 (Ср) 17:37

Сообщение Klinifini » 23.08.2006 (Ср) 23:44

Проверить ваш код не могу, видимо потому что у меня 2003 VS и ему не нравится что Sub s имеет параметры.
А обязательно метод s выделять в отдельный класс? если он будет внутри FOrm1 то должно работать.
Пожалуйста не ругайте меня.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.08.2006 (Чт) 6:09

Klinifini писал(а):Проверить ваш код не могу, видимо потому что у меня 2003 VS и ему не нравится что Sub s имеет параметры.

Напиши Option Strict Off, ему понравится.
Изображение


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 83

    TopList