Как проверить, подключен ли ftp-сервер, и получить сообщение об ошибке, если он не подключен?

Я новичок в программировании на vb.net. Я прошел долгий путь в своем развитии и понимании vb, но есть одна проблема, которую я не могу исправить. Я размещаю на своем компьютере FTP-сервер и создаю приложение для подключения к моему серверу и загрузки файлов. Проблема со всем примером кода заключается в том, что каждый предполагает, что сервер будет в сети. Мой компьютер может не работать круглосуточно, и у меня также может не быть запущена служба ftp. В первом случае он даже не должен регистрировать, что он подключен. Во втором случае БУДЕТ сказать, что подключен, потому что компьютер включен, но он вернет, что машина, к которой вы пытаетесь подключиться, активно отказывает в соединении. Есть ли способ TRULY проверить, действительно ли программа подключена к серверу БЕЗ генерации группы исключений в отладчике? Все, что я хочу, это звонок как:

Dim ftponline As Boolean = False 'Set default to false
ftponline = checkftp()
If ftponline Then
'continue program
Else
'try a different server
End If   

Так что это будет функция с именем checkftp, которая возвращает логическое значение true или false. Вот моя информация: Использование Visual Studio 2010 Pro Использование.Net Framework 4 Кто-нибудь может помочь? Спасибо! Я пробовал пакет ftp rebex, а также Ultimate FTP Pack. Вот обновленный код:

Public Function CheckConnection(address As String) As Boolean
    Dim logonServer As New System.Net.Sockets.TcpClient()
    Try
        logonServer.Connect(address, 21)
    Catch generatedExceptionName As Exception
        MessageBox.Show("Failed to connect to: " & address)
    End Try
    If logonServer.Connected Then
        MessageBox.Show("Connected to: " & address)
        Return True
        logonServer.Close()
    Else
        Return False
    End If

End Function
Public Sub ConnectFtp()
        types.Clear()
        models.Clear()
        ListBox1.Items.Clear()
        ListBox2.Items.Clear()
        TextBox2.Clear()
        Dim request As New Rebex.Net.Ftp
        If CheckConnection(*) Then
            Dim tempString As String()
            request.Connect(*)
            request.Login(*, *)
            request.ChangeDirectory("/atc3/HD_Models")
            Dim list As Array
            list = request.GetNameList()
            Dim item As String = ""
            For Each item In list
                tempString = item.Split(New Char() {" "c})
                If types.Contains(tempString(0)) = False Then
                    types.Add(tempString(0))
                End If
                If models.Contains(item) = False Then
                    models.Add(item)
                End If
            Next
            request.Disconnect()
            request.Dispose()
        ElseIf CheckConnection(*) Then
            request.Connect(*)
            request.Login(*, *)
            request.ChangeDirectory(*)
            Dim list2 As Array
            list2 = request.GetNameList()
            Dim item2 As String = ""
            Dim tempString2 As String()
            For Each item2 In list2
                MessageBox.Show(item2)
                tempString2 = item2.Split(New Char() {" "c})
                If types.Contains(tempString2(0)) = False Then
                    types.Add(tempString2(0))
                End If
                If models.Contains(item2) = False Then
                    models.Add(item2)
                End If
            Next
            request.Disconnect()
            request.Dispose()
        End If
    End Sub

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

2 ответа

Решение

Если ваш код разработан с надлежащим перехватом исключений, он не должен генерировать "кучу" исключений. Первое исключение, которое вы поймете, должно быть указанием на то, что соединение не установлено и ваш код должен прекратить попытки установить связь в этот момент. Если по какой-то причине вам действительно необходимо проверить подключение, прежде чем пытаться установить FTP-соединение, вы можете просто попытаться синхронно открыть TCP-сокет для порта FTP-сервера. Если это работает, оно работает.

Вы можете просто открыть сокет для IP-адреса сервера на порту 21 (при условии, что используется порт FTP по умолчанию).

Я не большой программист VB.Net, но вот ссылка на пример кода:

http://vb.net-informations.com/communications/vb.net_Client_Socket.htm

Если вы можете установить соединение через сокет, вы знаете, что что-то прослушивает этот порт (хотя вы еще не доказали, что это FTP-сервер или что он примет ваши учетные данные для входа в систему...).

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

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