【问题标题】:Monitor a remote FTP server with VB.net使用 VB.net 监控远程 FTP 服务器
【发布时间】:2021-04-20 07:48:06
【问题描述】:

我正在尝试使用此代码为远程 FTP 服务器创建一个简单的监视器 (在 Martin Prikryl 的大力帮助下构建)

    Private Function TestFTP(ByVal target As String, ByVal time As Integer) As Object
    Dim responseTime As Integer = 0
    Dim answer As Boolean
    Dim startTime As Integer = DateTime.Now.Millisecond
    Dim endTime As Integer
    Dim socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

    Try
        With socket
            .ReceiveTimeout = time
            .Ttl = 64
            .SendTimeout = time
            .Connect(target, 21)
            .Dispose()
            .Close()
        End With
        endTime = DateTime.Now.Millisecond
        IIf(endTime - startTime < 0, responseTime = endTime + 1000, responseTime = endTime)
        answer = True

    Catch ex As Exception
        responseTime = time
        answer = False
    End Try

    Return {responseTime, answer}
End Function

当 FTP 服务器启动并响应时,没有问题,但当它不存在时,我会在发送异常之前将我的应用挂起约 15 秒。

套接字本身没有超时连接(仅用于发送和接收命令 - 在函数中使用)。

我试图用计时器包裹它,但没有运气, 请帮忙。

男人

【问题讨论】:

    标签: vb.net sockets ftp timeout


    【解决方案1】:

    好的,在这件事上挣扎了几个小时后,我找到了解决问题的方法

    我实际上使用了 System.Net.Sockets.TcpClient 类

    我将异步 BeginConnect 与一个非常简单的 While 循环相结合,检查是否已连接,检查套接字是否已连接

     Private Function TestFTP(ByVal target As String, ByVal time As Integer) As Object
        Dim responseTime As Integer = 0
        Dim answer As Boolean
        Dim startTime As Integer = DateTime.Now.Millisecond
        Dim endTime As Integer
        Dim t As TcpClient = New TcpClient(AddressFamily.InterNetwork)
        Dim loops As Integer
        time *= 2
        t.BeginConnect(target, 21, Nothing, t)
        While Not t.Connected
            Thread.Sleep(Int(time / 6))
            loops += 1
            If loops >= 6 Then Exit While
        End While
        endTime = DateTime.Now.Millisecond
        t.Close()
        If loops >= 6 Then
            answer = False
            responseTime = 300
        Else
            answer = True
            If endTime >= startTime Then
                responseTime = endTime - startTime
            Else
                responseTime = endTime - startTime + 1000
            End If
        End If
    
    
        Return {responseTime, answer}
    End Function
    

    这对我有用,希望对某人有所帮助。

    【讨论】: