Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Visual Basic 6.0 / VBA » Problem: Datentransfer mit Winsock (code)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.07.2006, 19:26 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

Visual Basic:
' Wenn alle Bytes empfangen wurden, Datei schließen
    If nBytesRead = nBytesTotal Then
      Close #nFile
      nFile = 0
    End If


Wird das File geschlossen? Setz mal einen Haltepunkt auf Close #nFile.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2006, 18:03 Uhr
~ferhat
Gast


Wird das File geschlossen?

Auf jeden Fall wird halt die Datei abgespeichert, nur die ist dann fehlerhaft. Sie hat nie die richtige Größe.


Setz mal einen Haltepunkt auf Close #nFile.
Was ist ein Haltepunkt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.07.2006, 23:45 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

Zitat von ~ferhat:

Was ist ein Haltepunkt?

= Breakpoint = Programmpausierung = Stelle an dem der Debugger beim Debuggen anhalten soll.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Visual Basic 6.0 / VBA ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: