Gå til innhold

Webserver og store filer. Tregt!


Anbefalte innlegg

Heisann

 

Har fått opp en webserver her nå, og har kommet over et stort problem: Filene som brukeren spør etter lastes inn i en variabel. Med store filer tar det sinsykt lang tid! Her er koden:

Public Function LoadFile(filename1 As String) As String
If dir(filename1) = "" Then GoTo feil

Open filename1 For Binary As #1

   LoadFile = Input(FileLen(filename1), #1)

Close #1

Exit Function
feil:
LoadFile = Form1.Text1.text & vbNewLine & "<center><p><b>404</b></p></center>" & vbNewLine & "<center><p>The file you requested was no found!</p></center>" & vbNewLine & Form1.Text2.text
End Function

Jeg bruker den sånn:

Brukere(Index).SendData LoadFile("C:\filbane tralala")

Finnes det en raskere løsning?

 

Jonas

Lenke til kommentar
Videoannonse
Annonse

Det er mye raskere å manuelt sende filen i flere seksjoner, enn å la Winsock gjøre dette automatisk. Som du selv påpeker, må du da flytte hele filen over i en buffer, og dette kan bruke både tid og ram hvis filen er veldig stor.

 

Prøv derfor denne koden istedenfor:

 

Private Const Chunk As Integer = 4096

Public Sub SendFile(sPath As String, Winsock As Winsock)

Dim Free As Long, Remaining As Long
Dim NextChunk() As Byte

Open sPath For Binary Access Read As #Free

   Do

       Remaining = LOF(Free) - Loc(Free)
       
       If Remaining < 1 Then
           Winsock.Close
           Exit Do
       Else
       
           If Remaining >= Chunk Then
               ReDim NextChunk(Chunk - 1)
           Else
               ReDim NextChunk(Remaining - 1)
           End If
           
           Get #Free, , NextChunk
           Winsock.SendData NextChunk
       End If

       DoEvents
   Loop

Close #Free

End Sub

Endret av aadnk
Lenke til kommentar
Er du sikker på at du kaller metoden når Winsock objektet er tilkoblet en klient? Dobbelsjekk koden for feil. Skulle du ikke finne feilkilden, kan du selvsakt prøve å poste kildekoden her.

Min feil her :blush:

 

Hadde close kode fra den forrige sendemetoden :p

Private Sub brukere_SendComplete(Index As Integer)

 

List1.AddItem Brukere(Index).RemoteHostIP & " lukker tilkobling"

Brukere(Index).Close

 

End Sub

Den lukket tydelighvis etter at første del av fila var sendt :p

 

Edit: Har et lite problem til nå .. Når man laster ned en fil stopper den etter den første delen! Bare litt av filen blir lastet ned, og den stopper.

Endret av Jonas
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...