Buffered stream details

420 Views Asked by At

I want to explain my understanding with example. Let stream be any abstract buffered network stream with 4 bytes buffer. Let there be some byte-to-byte writing process (drawed like FIFO).

write->|    |    |    |    |----->net

----->net operation is very slow, and we want to minimize it's quantity. Here buffer helps.

write->|  1 |    |    |    |----->net
write->|  5 |  1 |    |    |----->net
write->| 12 |  5 |  1 |    |----->net
write->|  7 | 12 |  5 |  1 |----->net

Here, or, maybe, some time earlier, .NET virtual machine, or operating system, decides to complete writing operation and flushes the data:

write->|    |    |    |    |----->net   7 12 5 1->

So, write-> operations become very fast, and, at least after lag while stream closing, data become sended to the remote host.

In the code it can be look like this:

using(networkStream)
    for(var i = 0; i < 4; i++)
         networkStream.WriteByte(getNextByte());

Am I right? If getNextByte operation will lag a thread, can I count on that data will be passed to the stream stealthily (asynchroniously), will not WriteByte lag all the code? Or it will lag four times rarely? Haven't I implement some circular buffer to pass data to it, and launch additional thread which will read data from buffer and pass data to the network stream?

I also hope a lot that buffered network stream can increase speed of data receiving.

 read<-|    |  1 |  5 | 12 |<-----net <-7


 using(networkStream)
     while((b = networkStream.ReadByte()) >= 0)
         process(b);

If I synchroniously get and process bytes from buffered network stream, can I count on that data to the stream buffer will be transmitted by networkStream stealthily (asynchroniously), will not ReadByte lag all the code? Or it will lag four times rarely?

P.S. I know that standard NetworkStream stream is buffered.


Wanna tell about my concrete case. I have to realize striping of stream. I read data from stream from remote client and want to pass it to several streams to remote servers, but with alternating (called it forking) (image a), like this

var i = 0;
while((c = inStream.Read(buf, 0, portions[i])) > 0)
{
    outStreams[i].Write(buf, 0, c);
    i = (i + 1) % outStreams.Length;
}

image b shows merging process, coding in the same way.

I don't want to doom remote client to wait while program will do slow Write to remote servers operations. So, I tried to organize manually backgroung writting from network to inStream and backgroung reading from outStreams to network. But maybe I haven't care while I'm using buffered streams? Maybe buffered streams eliminate such breaks of read-write processes?

0

There are 0 best solutions below