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:
(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:
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
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
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