Загрузка файлов Winsock - vb6 - PullRequest
       21

Загрузка файлов Winsock - vb6

3 голосов
/ 04 октября 2009

Я пытаюсь использовать Winsock для загрузки и сохранения некоторых файлов. В моем случае у меня есть MSHFlexGrid с 2 столбцами: один с 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: неправильный протокол или соединение состояние для запрашиваемой транзакции или запрос

Что я делаю не так?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 октября 2009

Вы уже просмотрели эту страницу поддержки 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.

1 голос
/ 06 октября 2009

Я думаю, вы переоценили силу контроля Winsock. Вы не можете просто использовать метод GetData Winsock, чтобы достать и захватить файл. Должно быть активное соединение между вашим клиентским приложением и некоторым другим приложением на стороне сервера. После того как соединение установлено, это серверное приложение будет передавать данные в ваше приложение, событие WinArck 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, чтобы получить его все, поэтому он должен храниться в аккумуляторе во время обработки данных. Это больше, чем вы думаете.

Я хотел бы взглянуть на некоторые учебные пособия и / или пример кода (ищите проект VB6, который использует элемент управления Winsock на CodeProject, например this ).

...