Winsock下载文件-vb6

Winsock下载文件-vb6,vb6,winsock,download,Vb6,Winsock,Download,我正在尝试使用Winsock下载一些文件并保存它们。 在我的例子中,我有一个MSHFlexGrid,它有两列:一列有URL,另一列有“path+filename”(文件将保存在这里)。 我正在遍历所有行,调用下一个函数: Public Function DownloadSock(ArqURL作为字符串,ArqDestino作为字符串)作为布尔值 'ArqURL是文件URL “ArqDestino是下载的文件将存储在我的硬盘中的位置 Dim arquivo()作为字节 作为整数的Dim fiche

我正在尝试使用Winsock下载一些文件并保存它们。 在我的例子中,我有一个MSHFlexGrid,它有两列:一列有URL,另一列有“path+filename”(文件将保存在这里)。 我正在遍历所有行,调用下一个函数:

Public Function DownloadSock(ArqURL作为字符串,ArqDestino作为字符串)作为布尔值
'ArqURL是文件URL
“ArqDestino是下载的文件将存储在我的硬盘中的位置
Dim arquivo()作为字节
作为整数的Dim ficheiroID
ficheiroID=FreeFile
关于错误GoTo Trata_erro
打开二进制访问写为#ficheiroID的ArqDestino
Me.Winsock1.Connect ArqURL,80
Me.Winsock1.GetData arquivo()
Put#ficheiroID,arquivo()
闭合#菲舍里奥德
DownloadSock=True
退出功能
特拉塔埃罗:
MDIForm1.Text1=MDIForm1.Text1&“Error!”&Err.Number&Err.Description&“-”&Err.Source&“-URL:&ArqURL&”&Destino:&ArqDestino&vbNewLine
DownloadSock=False
端函数
我犯了这个错误

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

我做错了什么?

你查过了吗?这表明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
如果winsock.state=9'错误状态
winsock.close
当winsock.state0处于关闭状态时
多芬特
你需要一个while循环,因为它不会“立即”关闭。
如果结束
“现在你可以重新打开它,或者做任何你需要的事情
<>您也可以考虑将连接代码更改为:

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

如果.State sckClosed则.Close
.RemoteHost=ArqURL
.RemotePort=80
连接
以

最后一件事。查看Winsock控件的使用。

我认为您高估了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项目,如)。

这种方法可以使所有内容保持异步,同时避免调用
DoEvents
等待
Winsock.State
更改。在处理了由使用它的代码导致的太多难以调试的问题后,我特别担心
DoEvents
,因此我倾向于不惜一切代价避免它,即使这似乎是实现繁忙等待循环的简单方法。