Hej! Jag har gjort en klient och server som bland annat ska överföra många stora filer. Jag valde att göra detta med winsock, TCP. Jag skulle nog påstå att det är en begränsning i kontrollen; DoEvents lär väl inte vara något prestandamonster :/ Normalt sett så skulle man nog ha en buffer med vad som ska skickas, samt att "SendData" inte returnerar förrens datat faktiskt är skickat. Så jag är tveksam till om det finns någon lösning på problemet :/ Det enda jag kan komma på är att höja "chunksize", vad händer då? Spårar det ur helt då? Tack för ditt svar. Hej, Tack så jättemycket för ditt svar! De skillnader jag kan se är att du använder Input medan jag använder Get och att du, om jag tolkat koden rätt, väntar på svar innan du skickat datan? Tänkte bara påpeka att winsock inte gärna tar paket större än 2003h alltså 8195 bytes. Testa om det gör någon skillnad. Du kan använda 8192 för att vara på "den säkra sidan".Skicka 15mb+ filer med winsock i VB6
Allt är klart, och allt fungerar. Men då jag testar med klient och server på samma dator så kommer hastigheten upp i ~300kB/s. En fil (15mb) som annars skulle ta mindre än en sekund att kopiera mellan diskarna tar med programmet 43,1 sekunder.
Så det jag då undrar är; Är det jag som lyckats skriva oerhört ineffektiv kod, eller är det en begränsning som ligger i själva kontrollen? Om så är fallet, vad ska man använda istället?
Koden nedan är från serversidan:
Const ChunkSize = 65535
Public Sub SendFile(sock As Winsock, sFileName As String)
Dim Buffer As String
Dim SizeLeft As Long
Dim BSize As Long
Dim iFileNum
iFileNum = FreeFile
Open sFileName For Binary Access Read Lock Write As iFileNum
SizeLeft = LOF(iFileNum)
sock.SendData "FILE " & SizeLeft & vbCrLf
Do While SizeLeft > 0
If SizeLeft >= ChunkSize Then
SizeLeft = SizeLeft - ChunkSize
BSize = ChunkSize
Else
BSize = SizeLeft
SizeLeft = 0
End If
Buffer = Input(BSize, #iFileNum)
Do
DoEvents
Loop While Wait
sock.SendData Buffer
Wait = True
Loop
Close iFileNum
End Sub
Obs, idle-loopen körs tills sock_sendcomplete kallas, kontrollen får fnatt annars och skickar inte iväg hälften, och ibland reser några skumma fel.
Sv: Skicka 15mb+ filer med winsock i VB6
Sv:Skicka 15mb+ filer med winsock i VB6
Jag har testat med några olika ChunkSize, vid 1024 tog det (på samma fil) 45,8s, alltså en höjning på nästan 3 sekunder. Om jag sätter den över 2^16 så börjar den tappa data, troligen något i kontrollen som är satt till integer.
Att ha en buffer med hela filen och sedan skicka därifrån är helt uteslutet, jag skulle då käka ibland 100mb minne helt i onödan.
Om det nu är så att det kontrollen begränsar, vad ska jag använda istället? Är det kanske sockets API som gäller?Sv: Skicka 15mb+ filer med winsock i VB6
I mitt backup-program har jag nästan samma lösning. Jag kommer dock upp i en hastighet på ~1,4 MiB/s och har inga problem med att skicka stora filer (har provat med 170 MiB).
<code>
Public Sub uploadFile(theFile As String, theSocket As Winsock)
On Error GoTo ErrorHandler
Dim fileNumber As Long
Dim fileData As String
Dim packetSize As Long
packetSize = 3072
fileNumber = VBA.FreeFile
byteCount = 0
Open theFile For Binary Access Read As #fileNumber
fileLen = VBA.LOF(fileNumber)
Do
If Not theSocket.State = sckConnected Then Exit Do
If abortTransfer = True Then Exit Do
packetCompleted = False
fileData = VBA.Space$(packetSize)
Get #fileNumber, , fileData
If byteCount + packetSize > fileLen Then
theSocket.SendData VBA.Mid$(fileData, 1, fileLen - byteCount)
Else
theSocket.SendData fileData
End If
byteCount = byteCount + packetSize
Do Until packetCompleted = True
If abortTransfer = True Then Exit Do
DoEvents
Loop
DoEvents
Loop Until byteCount >= fileLen
Close #fileNumber
fileLen = 0
fileData = ""
Exit Sub
ErrorHandler:
Close #fileNumber
End Sub
</code>
/MickeSv:Skicka 15mb+ filer med winsock i VB6
Jag testade med din kod, och samma fil tar nu 2,9 sekunder! (=5mb/s)
Jag har jämfört våra funktioner och jag kommer verkligen inte på vad det är för skillnad som kan göra någon skillnad.
Någon som ser det uppenbara som jag missar? :)
Tack igen ;)Sv: Skicka 15mb+ filer med winsock i VB6
/MickeSv: Skicka 15mb+ filer med winsock i VB6