0

我是 vb.net 编程的新手。我在开发和理解 vb 方面取得了长足的进步,但有一个问题我似乎无法解决。我在我的电脑上托管一个 ftp 服务器,我正在制作一个应用程序来连接到我的服务器并下载文件。所有示例代码的问题是每个人都认为服务器将在线。我的电脑可能没有 24/7 运行,我也可能没有运行 ftp 服务。在第一种情况下,它甚至不应该注册它已连接。在第二种情况下,它会说已连接 b/c pc 已打开,但它会返回您尝试连接的机器正在积极拒绝连接。有没有办法真正检查程序是否确实连接到服务器而不在调试器中生成一堆异常?我想要的只是一个电话,例如:

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 框架 4 有人可以帮忙吗?谢谢!我已经尝试过 rebex ftp 包以及 Ultimate FTP 包。这是更新的代码:

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

无论我做什么,第二台服务器都无法连接。我什至放了一个消息框来显示在第二个服务器中返回了哪些项目,但是当我在服务器脱机的情况下运行程序时没有消息框出现。有没有人可以帮忙?

4

2 回答 2

0

您可以简单地在端口 21 上打开一个到服务器 IP 地址的套接字(假设默认 FTP 端口)。

我不是一个 VB.Net 程序员,但这里有一个示例代码的链接:

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

如果您可以建立套接字连接,您就知道该端口上正在侦听某些东西(尽管您还没有证明它是一个 FTP 服务器,或者它会接受您的登录凭据......)。

如果您希望简单地避免调试器中的异常,您可以将连接代码放在一个方法中并将DebuggerHidden属性应用于该方法。

于 2012-07-03T21:29:46.733 回答
0

如果您的代码设计有适当的异常捕获,则它不应该生成“一堆”异常。您捕获的第一个异常应该是您指示连接失败并且您的代码应该停止尝试在该点进行通信。如果由于某种原因您确实需要在尝试 FTP 连接之前检查连接,您应该能够简单地尝试同步打开一个 TCP 套接字到 FTP 服务器的端口。如果这行得通,它就会启动并运行。

于 2012-07-03T21:30:49.440 回答