Dateiübertragung per Winsock funktioniert nicht (viel Code!)

XanRaZoR

Mitglied
Moinmoin,
wie der Titel schon sagt, die Dateiübertragung bei Winsock funktioniert nicht korrekt.
Als 'Vorlage' habe ich das genommen: Klick mich!

Habe lediglich ein paar Variablen verändert, vl. hab ich irgendwo einen Fehler eingebaut wie auch immer, ich find den Fehler nicht.

Es schaut folgendermaßen aus: Das Client Programm schickt an den Server eine Nachricht in der Art 'Gib mir Datei!!'. Der Server schickt die Datei zurück (bzw. sollte).
Das Problem daran ist, dass immer nur 1KB übertragen wird, der Server zeigt jedoch an dass alles fertig übertragen wurde (z.B. 53000kB von 53000kB übertragen).

Der Code vom senden beim Server Programm sieht so aus:

Visual Basic:
Public Sub WinsockSendBinaryFile(ByVal Send_File 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 Send_File For Binary As #F
  
  ' Dateiname extrahieren
  If InStr(Send_File, "\") > 0 Then
    Send_File = Mid$(Send_File, InStrRev(Send_File, "\") + 1)
  End If
  
  ' Dateigröße
  nFileSize = LOF(F)
  
  ' Sendevorgang starten
  With frmMain.ws_Connection
    ' Empfänger mitteln, welche Datei und wieviele
    ' Daten gesendet werden
    .SendData "<begin size=" & CStr(nFileSize) & ";" & Send_File & ">"
    
    ' 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
      
      nFilePos = nFilePos + nBytesToRead
      
      frmMain.lbl_STATUS.Caption = CStr(nFilePos) + " von " + CStr(nFileSize) + " Bytes versandt"
            
      ' Wichtig!
      DoEvents
    Loop
  End With
  
  ' Datei schließen (Sendevorgang beendet)
  Close #F
End Sub
(Hab die Kommentare vom Tutorial drin gelassn - hoff es stört keinen.)
Mit Send_File am Anfang der Prozedur kommt der Pfad zur Datei rein, der vom Client mitgeschickt wird.


Der Code beim entgegennehmen der Datei (Client) sieht so aus:
Visual Basic:
Private Sub ws_Connection_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Dim sTemp As String
Static sFile As String

ws_Connection.GetData strData

  If Left$(strData, 12) = "<begin size=" Then
    ' Aha... eine neue Datei wird gesendet
    strData = Mid$(strData, 13)
    sTemp = Left$(strData, InStr(strData, ">") - 1)
    strData = Mid$(strData, InStr(strData, ">") + 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(strData) > 0 And nFile > 0 Then
    ' bisher empfangene Daten...
    nBytesRead = nBytesRead + Len(strData)
    
    ' Daten in Datei speichern
    Put #nFile, , strData
    
    ' Wenn alle Bytes empfangen wurden, Datei schließen
    If nBytesRead = nBytesTotal Then
      Close #nFile
      nFile = 0
    End If
  End If

'... noch paar zeilen Code, die aber mit dem Code hier nichts zu tun haben...

Der Verbindungsaufbau der Programme klappt perfekt und auch Textnachrichten usw. können fehlerfrei übertragen werden.

Wie gesagt, bei Dateien hört das Programm nach 1024kB auf, trotzdem zeigt der Server an dass alle Daten übertragen wurden.

Vl. ist jemand so nett und hat sich das ganze durchgelesen & evtl auch meinen Fehler gefunden ;)

MfG.
raz0r
 
Hi

Wie das genau war, weiss ich nicht mehr. Es klingt aber so als wenn Du nur ein Paket empfängst.
Lass Dir mal alle Variabeln (bytesTotal,strData,...) anzeigen und bastel dir dann eine eigene Schleife, welche wirklich alles empfängt. Du hast doch auch ne <end_size> oder so etwas. Der "End" Text in combi mit bytesTotal sollte dein prob. lösen.
PS: Die Schleife vom VB-Archiv ist irgendwie etwas undurchsichtig.
 
Zurück