0

vb.net でのプログラミングは初めてです。私は vb の開発と理解において長い道のりを歩んできましたが、修正できないように見える問題が 1 つあります。PCでftpサーバーをホストしており、サーバーに接続してファイルをダウンロードするためのアプリを作成しています。すべてのサンプル コードの問題は、誰もがサーバーがオンラインになると想定していることです。私の PC は 24 時間年中無休で実行されていない可能性があり、ftp サービスも実行されていない可能性があります。最初のケースでは、接続されていることを登録することさえできません。2 番目のケースでは、PC がオンになっているために接続されていると表示されますが、接続しようとしているマシンがアクティブに接続を拒否していることが返されます。デバッガーで一連の例外を生成せずに、プログラムが実際にサーバーに接続されているかどうかを本当に確認する方法はありますか? 私が欲しいのは次のような呼び出しだけです:

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

つまり、true または false のブール値を返す checkftp という関数になります。ここに私の情報があります: Visual Studio 2010 Pro の使用 .Net Framework 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

私が何をしても、2番目のサーバーは接続しません。2番目のサーバーで返されたアイテムを表示するメッセージボックスも配置しましたが、サーバーをオフラインにしてプログラムを実行してもメッセージボックスは表示されません. 助けてくれる人はいますか?

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接続を試みる前に接続を確認する必要がある場合は、FTPサーバーのポートへのTCPソケットを同期的に開くことを試みることができるはずです。それが機能する場合、それは稼働しています。

于 2012-07-03T21:30:49.440 に答える