000
07.07.2006, 12:13 Uhr
~Ferhat
Gast
|
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 Dieser Post wurde am 07.07.2006 um 19:22 Uhr von Uwe editiert. |