24. juli 2011 - 19:19Der 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.
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?
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
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
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.