Как проверить, подключен ли 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 к этому методу.