4

我正在尝试使用 Winsock 下载一些文件并保存它们。就我而言,我有一个包含 2 列的 MSHFlexGrid:一列带有 URL,另一列带有“路径+文件名”(文件将被保存到的位置)。我正在遍历调用下一个函数的所有行:

Public Function DownloadSock(ArqURL As String, ArqDestino As String) As Boolean
'ArqURL is the file URL
'ArqDestino is where the downloaded file is going to be stored, in my hard disc

Dim arquivo() As Byte
Dim ficheiroID As Integer

ficheiroID = FreeFile
On Error GoTo Trata_erro
Open ArqDestino For Binary Access Write As #ficheiroID


Me.Winsock1.Connect ArqURL, 80 
Me.Winsock1.GetData arquivo()
Put #ficheiroID, , arquivo()

Close #ficheiroID

DownloadSock = True


Exit Function

Trata_erro:

    MDIForm1.Text1 = MDIForm1.Text1 & "Error! " & Err.Number & Err.Description & " - " & Err.Source & " - URL: " & ArqURL & " - Destino: " & ArqDestino & vbNewLine
    DownloadSock = False

End Function

我收到此错误

40006:请求的事务或请求的错误协议或连接状态

我究竟做错了什么?

4

2 回答 2

2

您是否查看过此Microsoft 支持页面?这表明 Winsock 控件中存在错误,并且该修补程序可能会有所帮助。

要尝试的另一件事是在尝试读取/发送数据之前确保您的 winsock 连接已打开,如果已关闭,请重新打开新连接:

if winsock.state=9 ' error state
  winsock.close
  while winsock.state<>0 ' closed state
    doEvents
  wend ' you need a while loop, because it doesn't close "immediately".
end if
' now you reopen it, or do whatever else you need

您也可以考虑将连接代码更改为:

With Winsock1
      If .State <> sckClosed Then .Close
      .RemoteHost = ArqURL 
      .RemotePort = 80
      .Connect
End With

最后一件事。查看这篇关于使用 Winsock 控件的帖子。

于 2009-10-05T00:24:02.707 回答
1

我认为您高估了 Winsock 控件的功能。您不能只使用 Winsock 的 GetData 方法来获取文件。您的客户端应用程序和服务器端的其他一些应用程序之间必须有一个活动连接。建立连接后,此服务器应用程序将向您的应用程序提供数据,Winsock 的 DataArrival 事件将触发,然后您可以使用 GetData 方法检索它。您的代码应该看起来更像这样:

Public Sub DownloadSock(ArqURL As String)

  Dim arquivo() As Byte
  Dim ficheiroID As Integer

  ficheiroID = FreeFile
  Me.Winsock1.Connect ArqURL, 80

End Function

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

  Dim ArqDestino As String
  Dim arquivo() As Byte
  Dim ficheiroID As Integer

  ficheiroID = FreeFile
  Open ArqDestino For Binary Access Write As #ficheiroID
  Me.Winsock1.GetData arquivo()
  Put #ficheiroID, , arquivo()
  Close #ficheiroID

End Sub

然而,这还远未完成(也不能保证语法正确,将其视为伪代码)。建立连接后,您必须实现一些机制来告诉服务器开始发送文件。如果文件足够大,则需要许多 DataArrival 事件才能获取所有内容,因此在遇到数据时必须将其保存在累加器中。这比你想象的要多。

我会看一些教程和/或示例代码(在 CodeProject 上寻找一个使用 Winsock 控件的 VB6 项目,比如这个)。

于 2009-10-06T19:05:23.697 回答