Hallo
Ich habe follgendes Problem. Ich möcht mittels Winsock eine Datei nach dem Andern vom Netz downloaden. Im falle der ersten Datei funktioniert das ganze. Wie kann ich aber weitere Dateien downloaden, wenn die Verbindung schon besteht?
Danke für jeden Hinweis, Grüsse Sebastian
Hallo,
Ich habe follgendes Problem. Ich möcht mittels Winsock eine
Datei nach dem Andern vom Netz downloaden. Im falle der ersten
Datei funktioniert das ganze. Wie kann ich aber weitere
Dateien downloaden, wenn die Verbindung schon besteht?
die Zeile, in der der Befehl steht, die Datei zu laden, wiederholen, oder in eine Schleife einbauen …
Ich verstehe das Problem nicht so recht. Poste doch mal den Code.
Gruß, Rainer
Also Grob sieht das etwa so aus:
**************Code in Form******************
Private Sub Form_Load()
mDownload.DoDownload „http://www.nothilfe.org/nhkadmin/update/nhkdaten/aut…“ & l & „.info“, Path(13) & „“ & l & „\aupd“ & l & „.info“
Connect
end sub
Public Sub Connect()
If Winsock1.State = sckOpen Then Winsock1.Close
If Winsock1.State sckError Then
’ Diese Prozedur rufen Sie auf, um den Download zu starten:
With Winsock1
.RemoteHost = strRemoteHost '(strRemoteHost ist Public String (www.nothilfe.org)))
.RemotePort = 80 ’ HTTP-Standardport
.Connect
End With
Else
MsgBox „Winsockverbindungsfehler!“, vbCritical, „Fatal Error“
Unload Me
End If
Public Sub Winsock1_Connect()
’ Nach erfolgreicher Kontaktaufnahme HTTP-Anfrage zum Server senden
'Set FileD = New clsDownload
Dim sRequest As String
’ HTTP-Anfrage erstellen und mit leerer Zeile abschließen:
sRequest = „GET " & strFilePath & " HTTP/1.0“ & vbNewLine
sRequest = sRequest & "Host: " & strRemoteHost & vbNewLine
sRequest = sRequest & „Accept: */*“ & vbNewLine 'Alle Dateien sind erlaubt
sRequest = sRequest & „Connection: close“ & vbNewLine 'Nach dem Senden, Connection schliessen
sRequest = sRequest & vbNewLine
’ Die Anfrage absenden:
Winsock1.SendData sRequest
’ Hauptanwendung mitteilen, dass der Datei-Download
’ nun gestartet wird
End Sub
Private Sub Winsock1_DataArrival(ByVal BytesTotal As Long)
'Set FileD = New clsDownload
'Es kommen Daten vom RemoteHost an
mDownload.ArrivalProgress BytesTotal
End Sub
*************Ende Code Form*******************
************mDownload Modul*****************
'Datei-Download
Public Function DoDownload(ByVal strURL As String, _
ByVal strLocalFile As String) As Boolean
’ Fehlerbehandlung aktivieren
'On Error GoTo Download_Error
’ Ggf. http:// entfernen
If LCase$(Left$(strURL, 7)) = „http://“ Then
strURL = Mid$(strURL, 8)
End If
’ RemoteHost
strRemoteHost = Left$(strURL, InStr(1, strURL, „/“) - 1)
’ relativer Pfad
strFilePath = Mid$(strURL, InStr(1, strURL, „/“))
’ Lokaler Dateiname (ggf. löschen)
strLocalFilename = strLocalFile
If Dir$(strLocalFilename, vbNormal) „“ Then
Kill strLocalFilename
End If
'DWL.Show
End Function
Public Function ArrivalProgress(ByVal BytesTotal As Long)
Static sReply As String
Dim sNewData As String
Dim lPos1 As Long, i As Long
Dim lPos2 As Long
Dim lLenHeader As Long
Dim lLenBody As Long
Dim F
'Set FileD = New clsDownload
If BytesTotal = 0 Then Exit Function
’ Neue Daten abholen und anhängen
DWL.Winsock1.GetData sNewData
sReply = sReply & sNewData
’ Im Header die Größenangabe des Dokuments suchen:
lPos1 = InStr(sReply, "Content-Length: ") + 16
'If lPos1 = 16 Then ’ Noch nicht angekommen
’ Exit Function
'End If
’ Den folgenden Zeilenumbruch suchen:
lPos2 = InStr(lPos1, sReply, vbCrLf)
If lPos2 = 0 Then ’ Noch nicht angekommen
Exit Function
End If
’ Hieraus die Größe des Dokuments in Bytes ermitteln:
lLenBody = Val(Mid$(sReply, lPos1, lPos2 - (lPos1)))
’ Die Abtrennung zwischen HTTP-Header und HTML-Code suchen:
lLenHeader = InStr(sReply, vbNewLine & vbNewLine) + 3
If lLenHeader = 3 Then ’ Noch nicht angekommen
Exit Function
End If
’ Ist die Übertragung vollständig?
If Len(sReply) - lLenHeader = lLenBody Then
’ HTML-Code (ohne Header) in einem Textbox-Control anzeigen
sReply = Mid$(sReply, lLenHeader + 1)
'txtSource.Text = sReply
End If
'HTML Existiert nicht!
For i = 1 To Len(sReply)
If Mid(sReply, i, 10) = „404“ Then Exit Function
Next i
'Wenn nur Header eingelesen wird
If Len(sReply) = lLenHeader Then Exit Function
’ Daten in Datei speichern
F = FreeFile
Open strLocalFilename For Append As #F
Print #F, sReply;
Close #F
'Fortschritt
lngFileSize = lngFileSize + Len(sReply)
'RaiseEvent Progress lngFileSize, lLenBody
'Fortschritt
FileDownload_Progress lngFileSize, lLenBody
'DWL.picboxStatus
'ReadInDownloadFiles
end function
******************Ende Do Download****************
So jetzt möchte ich nach dem Arrival Prozess die nächste Datei Downloaden, also:
mDownload.DoDownload „http://www.nothilfe.org/nhkadmin/update/nhkdaten/aut…“ & l & „.info“, Path(13) & „“ & l & "\l & „.exe“
connect
Das geht nun aber nicht.
- Wähle ich Connect (Prozedur in der Form), so gibt es einen Fehler
- mache ich einfach nur DoDownload… kommt nichts an
- Habe ich den Einsprungspunkt bei Winsock1_Connect, dann gibt es einen Fehler im Protokoll
- Wenn ich zuerst die Verbindung Wiinsock1.close mache und dann Connect ausführe gibt es ein Fehler bei Punkt Host, da anscheinend schon ein Host existiert.
Mittlerweilen habe ich was gelesen über Winsock1(Index as integer) und diesen dann aufzählen, das konnte ich noch nicht testen, vielleicht ist das die Lösung.
Dann habe ich gelesen, dass Winsock jedesmal geschlossen, und dann wieder geöffnet werden muss, das würde ich ja mit winsock1.clos tun, die Statusausgabe wäre dann 0, aber es funktioniert auch dann nicht.
Besten Dank für jegliche Hilfe
Grüsse Sebastian
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo Sebastian,
ich reduziere das Beispiel mal auf das für uns im Moment Wesentliche.
Public Sub Winsock1\_Connect()
' Nach erfolgreicher Kontaktaufnahme HTTP-Anfrage zum Server senden
'Set FileD = New clsDownload
Dim sRequest As String
' HTTP-Anfrage erstellen und mit leerer Zeile abschließen:
sRequest = "GET " & strFilePath & " HTTP/1.0" & vbNewLine
sRequest = sRequest & "Host: " & strRemoteHost & vbNewLine
sRequest = sRequest & "Accept: \*/\*" & vbNewLine 'Alle Dateien sind erlaubt
sRequest = sRequest & "Connection: close" & vbNewLine 'Nach dem Senden, Connection schliessen
sRequest = sRequest & vbNewLine
' Die Anfrage absenden:
Winsock1.SendData sRequest
' Hauptanwendung mitteilen, dass der Datei-Download
' nun gestartet wird
End Sub
Wenn Du da die Zeile
sRequest = sRequest & "Connection: close" & vbNewLine 'Nach dem Senden, Connection schliessen
weg lässt, wird die Verbindung nicht geschlossen und Du kannst eine weitere Anfrage Senden.
Ungetestet …
sRequest = "GET " & strFilePath1 & " HTTP/1.0" & vbNewLine
sRequest = sRequest & "Host: " & strRemoteHost & vbNewLine
sRequest = sRequest & "Accept: \*/\*" & vbNewLine
sRequest = sRequest & vbNewLine
Winsock1.SendData sRequest
sRequest = "GET " & strFilePath2 & " HTTP/1.0" & vbNewLine
sRequest = sRequest & "Host: " & strRemoteHost & vbNewLine
sRequest = sRequest & "Accept: \*/\*" & vbNewLine
sRequest = sRequest & vbNewLine
Winsock1.SendData sRequest
sRequest = "GET " & strFilePath3 & " HTTP/1.0" & vbNewLine
sRequest = sRequest & "Host: " & strRemoteHost & vbNewLine
sRequest = sRequest & "Accept: \*/\*" & vbNewLine
sRequest = sRequest & "Connection: close" & vbNewLine 'Nach dem Senden, Connection schliessen
sRequest = sRequest & vbNewLine
Winsock1.SendData sRequest
End Sub
… so etwa. Geht’s?
Gruß, Rainer