Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Skicka 15mb+ filer med winsock i VB6

Postades av 2007-02-08 22:39:53 - Mikael Wikman, i forum visual basic - allmänt, Tråden har 7 Kommentarer och lästs av 876 personer

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.
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.


Svara

Sv: Skicka 15mb+ filer med winsock i VB6

Postades av 2007-02-09 02:03:39 - Oskar Johansson

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å?


Svara

Sv:Skicka 15mb+ filer med winsock i VB6

Postades av 2007-02-09 10:05:26 - Mikael Wikman

Tack för ditt svar.

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?


Svara

Sv: Skicka 15mb+ filer med winsock i VB6

Postades av 2007-02-09 15:47:42 - Mikael Jönsson

Hej,

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>

/Micke


Svara

Sv:Skicka 15mb+ filer med winsock i VB6

Postades av 2007-02-09 19:00:59 - Mikael Wikman

Tack så jättemycket för ditt svar!

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 ;)


Svara

Sv: Skicka 15mb+ filer med winsock i VB6

Postades av 2007-02-09 19:03:17 - Mikael Jönsson

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?

/Micke


Svara

Sv: Skicka 15mb+ filer med winsock i VB6

Postades av 2007-02-14 01:51:33 - Johan Forsberg

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".


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 725
27 958
271 751
566
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies