F
FerHat
Guest
Ich hatte mal den folgenden vorgefertigten code gefunden, mit dem man eine Datei per
Winsock verschicken kann. Das Versenden ansich funktioniert zwar, doch wenn die jeweilige Datei
vollständig verschickt wurde, speichert z.B. der "Server" die Datei nicht richtig ab.
Bei jpeg Bildern z.B. erscheint zwar die Datei nach dem Transfer, kann aber nicht
geöffnet werden. Woran könnte das liegen?
Testet auch mal bitte den Code und guckt mal, obs bei Euch auch so ist.
1.) Code fürs Senden der Datei:
Visual Basic:
Public Sub WinsockSendBinaryFile(ByVal sFile As String)
Dim F As Integer
Dim sBuffer As String
Dim nFileSize As Long
Dim nFilePos As Long
Dim nBytesToRead As Long
' Größe der einzelnen Datenpakete
Const BlockSize = 1024
' Datei im Binary-Mode öffnen
F = FreeFile
Open sFile For Binary As #F
' Dateiname extrahieren
If InStr(sFile, "\") > 0 Then
sFile = Mid$(sFile, InStrRev(sFile, "\") + 1)
End If
' Dateigröße
nFileSize = LOF(F)
' Sendevorgang starten
With Winsock1
' Empfänger mitteln, welche Datei und wieviele
' Daten gesendet werden
.SendData "<begin size=" & CStr(nFileSize) & ";" & sFile & ">"
' Datei blockweise senden
Do While nFilePos < nFileSize
nBytesToRead = BlockSize
If nFilePos + nBytesToRead > nFileSize Then
nBytesToRead = nFileSize - nFilePos
End If
' Datenblock lesen
sBuffer = Space$(nBytesToRead)
Get #F, , sBuffer
' Datenblock senden
.SendData sBuffer
' Fortschritt aktualisieren
nFilePos = nFilePos + nBytesToRead
txtStatusSend.Text = CStr(nFilePos) + " von " + CStr(nFileSize) + " Bytes versandt"
' Wichtig!
DoEvents
Loop
End With
' Datei schließen (Sendevorgang beendet)
Close #F
End Sub
2.) Code zum Empfangen und Abspeichern der Datei:
Visual Basic:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
Dim sTemp As String
Static sFile As String
' Daten holen
Winsock1.GetData sData, vbString
If Left$(sData, 12) = "<begin size=" Then
' Aha... eine neue Datei wird gesendet
sData = Mid$(sData, 13)
sTemp = Left$(sData, InStr(sData, ">") - 1)
sData = Mid$(sData, InStr(sData, ">") + 1)
' Dateigröße und Dateiname ermitteln
If InStr(sTemp, ";") > 0 Then
nBytesTotal = Val(Left$(sTemp, InStr(sTemp, ";") - 1))
sFile = Mid$(sTemp, InStr(sTemp, ";") + 1)
Else
nBytesTotal = Val(sTemp)
End If
' Falls kein Dateiname angegeben wurde,
' Daten unter "temp.dat" speichern
If Len(sFile) = 0 Then sFile = "temp.dat"
' ggf. Datei löschen, falls bereits existiert
On Error Resume Next
Kill App.Path & "\" & sFile
On Error GoTo 0
' Datei im Binary-Mode öffnen
nFile = FreeFile
Open App.Path & "\" & sFile For Binary As #nFile
' bisher gelesene Bytes zurücksetzen
nBytesRead = 0
End If
If Len(sData) > 0 And nFile > 0 Then
' bisher empfangene Daten...
nBytesRead = nBytesRead + Len(sData)
' Daten in Datei speichern
Put #nFile, , sData
' evtl. Fortschritt anzeigen
'txtStatusRecieve.Text = CStr(nBytesRead) & " von " & CStr(nBytesTotal) & " Bytes empfangen"
' Wenn alle Bytes empfangen wurden, Datei schließen
If nBytesRead = nBytesTotal Then
Close #nFile
nFile = 0
End If
End If
End Sub
Sollte keine ne Lösung finden, wärs nett, ne Alternative zu posten
mfg
Winsock verschicken kann. Das Versenden ansich funktioniert zwar, doch wenn die jeweilige Datei
vollständig verschickt wurde, speichert z.B. der "Server" die Datei nicht richtig ab.
Bei jpeg Bildern z.B. erscheint zwar die Datei nach dem Transfer, kann aber nicht
geöffnet werden. Woran könnte das liegen?
Testet auch mal bitte den Code und guckt mal, obs bei Euch auch so ist.
1.) Code fürs Senden der Datei:
Visual Basic:
Public Sub WinsockSendBinaryFile(ByVal sFile As String)
Dim F As Integer
Dim sBuffer As String
Dim nFileSize As Long
Dim nFilePos As Long
Dim nBytesToRead As Long
' Größe der einzelnen Datenpakete
Const BlockSize = 1024
' Datei im Binary-Mode öffnen
F = FreeFile
Open sFile For Binary As #F
' Dateiname extrahieren
If InStr(sFile, "\") > 0 Then
sFile = Mid$(sFile, InStrRev(sFile, "\") + 1)
End If
' Dateigröße
nFileSize = LOF(F)
' Sendevorgang starten
With Winsock1
' Empfänger mitteln, welche Datei und wieviele
' Daten gesendet werden
.SendData "<begin size=" & CStr(nFileSize) & ";" & sFile & ">"
' Datei blockweise senden
Do While nFilePos < nFileSize
nBytesToRead = BlockSize
If nFilePos + nBytesToRead > nFileSize Then
nBytesToRead = nFileSize - nFilePos
End If
' Datenblock lesen
sBuffer = Space$(nBytesToRead)
Get #F, , sBuffer
' Datenblock senden
.SendData sBuffer
' Fortschritt aktualisieren
nFilePos = nFilePos + nBytesToRead
txtStatusSend.Text = CStr(nFilePos) + " von " + CStr(nFileSize) + " Bytes versandt"
' Wichtig!
DoEvents
Loop
End With
' Datei schließen (Sendevorgang beendet)
Close #F
End Sub
2.) Code zum Empfangen und Abspeichern der Datei:
Visual Basic:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
Dim sTemp As String
Static sFile As String
' Daten holen
Winsock1.GetData sData, vbString
If Left$(sData, 12) = "<begin size=" Then
' Aha... eine neue Datei wird gesendet
sData = Mid$(sData, 13)
sTemp = Left$(sData, InStr(sData, ">") - 1)
sData = Mid$(sData, InStr(sData, ">") + 1)
' Dateigröße und Dateiname ermitteln
If InStr(sTemp, ";") > 0 Then
nBytesTotal = Val(Left$(sTemp, InStr(sTemp, ";") - 1))
sFile = Mid$(sTemp, InStr(sTemp, ";") + 1)
Else
nBytesTotal = Val(sTemp)
End If
' Falls kein Dateiname angegeben wurde,
' Daten unter "temp.dat" speichern
If Len(sFile) = 0 Then sFile = "temp.dat"
' ggf. Datei löschen, falls bereits existiert
On Error Resume Next
Kill App.Path & "\" & sFile
On Error GoTo 0
' Datei im Binary-Mode öffnen
nFile = FreeFile
Open App.Path & "\" & sFile For Binary As #nFile
' bisher gelesene Bytes zurücksetzen
nBytesRead = 0
End If
If Len(sData) > 0 And nFile > 0 Then
' bisher empfangene Daten...
nBytesRead = nBytesRead + Len(sData)
' Daten in Datei speichern
Put #nFile, , sData
' evtl. Fortschritt anzeigen
'txtStatusRecieve.Text = CStr(nBytesRead) & " von " & CStr(nBytesTotal) & " Bytes empfangen"
' Wenn alle Bytes empfangen wurden, Datei schließen
If nBytesRead = nBytesTotal Then
Close #nFile
nFile = 0
End If
End If
End Sub
Sollte keine ne Lösung finden, wärs nett, ne Alternative zu posten
mfg