我的主机太差了,下载的人多时就会掉线,也就是会下载到一半的时候winsock就无数据下载了,
我用Inet控件下载时会出理“超时”,问题是现在我用winsock下载了,怎么发现主机掉线了?还有怎么设置段点续传呀
下面是我用winsock下载文件的全部源代码,我的问题是下面这段代码怎么监测到断线了,还有就是当重新链接时怎么做断点续传?Option Explicit
'下载文件长度
Private mFlen As Long
Dim timeA As Long
Dim ReceiveBytes As LongPrivate Sub Command1_Click()
    If Winsock1.State <> sckClosed Then   '如果Winsock1当前状态非关闭
        Winsock1.Close                    '关闭连接
    End If
    Winsock1.RemoteHost = "61.159.186.139"      '服务器地址
    Winsock1.RemotePort = 80            '服务器端口
    Winsock1.Connect                      '连接
    'Text2.Text = "开始联接..." & vbCrLf
    'Timer1.Enabled = True
End SubPrivate Sub Form_Unload(Cancel As Integer)
    Winsock1.Close   '关闭连接
End SubPrivate Sub Winsock1_Close()
    Winsock1.Close   '关闭连接
    Label3 = "关闭了"
End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生
Dim strWebPage As StringstrWebPage = "/download2/少林传奇/少林传奇wz.exe" '要下载的文件 'http://61.159.186.139/download2/少林传奇/少林传奇wz.exe
strWebPage = "GET " + strWebPage + " HTTP/1.0" + vbCrLf '        'GET 为FTP命令 取得文件
'Getstr = Getstr & "Range: bytes=" & ReceiveBytes & "-" & vbCrLf
strWebPage = strWebPage + vbCrLf '记住一定要加上vbCrLf
Winsock1.SendData strWebPage '给远程计算机发送数据
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim TheFile() As Byte                    '接受数据的数组
    ReDim TheFile(bytesTotal)                '重定义数组下界
    Static YNLen As Boolean                  '是否接收了文件长度
    '接收到的下载数据(字符串类型)
    Dim ReceiveData As String
    Dim i As Long
    Dim StartPos As Long
    Winsock1.GetData TheFile                 '将接收的数据保存到数组If Not YNLen Then
    ReceiveData = ReceiveData & StrConv(TheFile, vbUnicode)
    Debug.Print ReceiveData
    If (InStr(1, ReceiveData, "HTTP/1.0 200 OK") Or InStr(1, ReceiveData, "HTTP/1.1 200 OK")) Then '表示请求下载文件成功
        Debug.Print "接联成功..."
    ElseIf (InStr(1, ReceiveData, "HTTP/1.0 404 ") Or InStr(1, ReceiveData, "HTTP/1.1 404")) Then  '表示服务器未找到请求的资源
        Debug.Print "没有找到相关文件..."
        Exit Sub
    Else '请求错误
        MsgBox "出错了"
        Exit Sub
    End If
    '如果服务器响应的字符串有指定文件大小的标题字段,取得文件大小
    If InStr(1, ReceiveData, "Content-Length:") > 0 And mFlen = 0 Then
       Dim pos1 As Long, pos2 As Long
       pos1 = InStr(1, ReceiveData, "Content-Length:")
       pos2 = InStr(pos1 + 16, ReceiveData, vbCrLf)
        If pos2 > pos1 Then
            mFlen = Mid(ReceiveData, pos1 + 16, pos2 - pos1 - 16)
            
            YNLen = True
            'Open "d:\1.ini" For Binary As #1    '打开文件
            Open "c:\ddd.exe" For Binary Lock Write As #1
            Debug.Print "开始接收数据..."
            Debug.Print "文件大小:" & mFlen
        End If
                For i = 0 To UBound(TheFile) - 3
                    If TheFile(i) = 13 And TheFile(i + 1) = 10 And TheFile(i + 2) = 13 And TheFile(i + 3) = 10 Then
                        StartPos = i + 4
                        Exit For
                    End If
                Next i
                For i = StartPos To UBound(TheFile())
                    Put #1, , TheFile(i)
                Next i
                ReceiveBytes = Seek(1)
     End If
        
        ProgressBar1.Max = mFlen + 1 '设置进度条最大值
        ProgressBar1.Min = 0           '设置进度条最小值
        Label5 = Format$(mFlen / 1024 / 1024, "0.00")
Else
        ReceiveBytes = ReceiveBytes + bytesTotal
        Put #1, , TheFile                '将接收的数据包写入该文件
        ProgressBar1.Value = ReceiveBytes '接收文件进度
        If ReceiveBytes >= mFlen Then Close #1: MsgBox "下载完成..."
End If
Label3 = bytesTotal
Label4 = Format$(ReceiveBytes / 1024 / 1024, "0.00")End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox Description, vbInformation, "错误号:" & Number   '出错提示
    Winsock1.Close   '关闭连接
End Sub

解决方案 »

  1.   

    'Getstr = Getstr & "Range: bytes=" & ReceiveBytes & "-" & vbCrLf   这是断点续传语句,不过不知在这里为什么这样。前面有个',变量也getstr, 有什么用处。在这里,也就是没有断点续传的。可以改一下
    ReceiveBytes是续传的开始位置。
    strWebPage = strWebPage & "Range: bytes=" & ReceiveBytes & "-" & vbCrLf
      

  2.   

    Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
        MsgBox Description, vbInformation, "错误号:" & Number   '出错提示
        Winsock1.Close   '关闭连接
    End Sub出错,可能断线了。
      

  3.   

    Winsock1_Error 事件并不一定是出错了才会发生~有时候出错了,但连接没断开,你这不是很冤吗?
      

  4.   

    你升级到sp6了吗?没有就请升级sp6,更正了winsock的小BUG。