Avatar billede Solink Nybegynder
24. juli 2011 - 19:19 Der er 9 kommentarer og
1 løsning

Delimite stream

Jeg er vel lidt det man kan kalde en TCP-newbie.

I mit program vil jeg sende en række billeder uden at åbne en ny forbindelse for hvert billede.

Hvordan kan jeg delimite billederne? Lidt i stil med ReadLine/WriteLine.

Håber nogen kan hjælpe!

På forhånd tak.

Jeg har forsøgt at løse problemet ved at sende længden på det enkelte billede før jeg sender data. Problemet er så, at dataen sommetider kombineres med længden. Det hjælper ikke at flushe eller bruge Nagle, der er åbenbart en del af TCP protokollen.

UDP er ikke en mulighed.
Avatar billede arne_v Ekspert
24. juli 2011 - 19:22 #1
send laengde N, send N bytes
laes laengde N, laes N Bytes

vil altid virke.

Tricket er kun at laese de N bytes, men det er muligt at angive hvor mange bytes du maksimalt vil laese.
Avatar billede Solink Nybegynder
24. juli 2011 - 19:28 #2
Lad os så antage, at der er mere i den packet jeg læser end bare længden og dataen. Det hænder nemlig, at de packets jeg sender er kombinerede når jeg modtager dem.

Skal jeg så bare læse videre? Kan det ske, at der er noget data der mangler?
Avatar billede arne_v Ekspert
25. juli 2011 - 00:00 #3
Med TCP opererer du paa streams ikke paa packets.

Og du kan bestemme praecis hvor mange bytes du maksimalt vil laese.

TCP protokollen soerger selv for at gensende hvis noget bliver tabt undervejs og det er usynligt for din app.
Avatar billede Solink Nybegynder
25. juli 2011 - 21:32 #4
Har forsøgt #1. De første chunks bliver sendt og læst uden problemer. Men pludselig læser min modtager en negativ længde (eller en længde langt over chunk størrelsen på 6144).


Her er min modtager
            Dim LengthArray(4 - 1) As Byte
            Dim Read As Integer = Socket.GetStream().Read(LengthArray, 0, 4)
            While (Read > 0)
                Dim DataArray(BitConverter.ToInt32(LengthArray, 0) - 1) As Byte
                ' Læs data
                Dim DataLength As Integer = Socket.GetStream().Read(DataArray, 0, DataArray.Length)
                mStream.Write(DataArray, 0, DataLength)
                ' Læs længde igen
                Socket.GetStream().Read(LengthArray, 0, 4)
            End While


og min sender

                Dim DataArray(6144 - 1) As Byte
                Dim Read As Integer = ms.Read(DataArray, 0, DataArray.Length)
                While (Read > 0)
                    ' Send data
                    Stream.Write(BitConverter.GetBytes(Read), 0, 4)
                    Stream.Write(DataArray, 0, Read)
                    Stream.Flush()
                    ' Læs igen
                    Read = ms.Read(DataArray, 0, DataArray.Length)
                End While


Har du nogen ide om, hvad dette problem skyldes?
Avatar billede Solink Nybegynder
25. juli 2011 - 21:33 #5
Opdagede lige at jeg havde glemt Read = (..) nederst i min modtager, men problemet er endnu ikke løst.
Avatar billede Solink Nybegynder
25. juli 2011 - 21:55 #6
Den læste åbenbart ikke det antal bytes jeg bad den om, så tilføjede dette:

                Dim DataRead As Integer = 0
                Do Until DataRead = Length
                    Dim DataArray(Length - 1) As Byte
                    ' Læs data
                    Dim DataLength As Integer = Socket.GetStream().Read(DataArray, 0, Length - DataRead)
                    DataRead += DataLength
                    ' Skriv til memory
                    mStream.Write(DataArray, 0, DataLength)
                Loop


- og nu ser det ud til at virke!

Er der en anden måde at omgå dette problem på?
Avatar billede arne_v Ekspert
26. juli 2011 - 01:40 #7
Det er maaden at goere det paa.

Read(DataArray, 0, DataArray.Length)

kan jo nemt laese flere bytes end du oensker at laese.
Avatar billede arne_v Ekspert
26. juli 2011 - 01:41 #8
Read(DataArray, 0, Length - DataRead)

laeser maksimalt det antal bytes du mangler.
Avatar billede Solink Nybegynder
26. juli 2011 - 15:42 #9
Smid et svar, Arne :-)
Avatar billede arne_v Ekspert
26. juli 2011 - 18:24 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester