Does NetworkStream.DataAvailable see buffered data?

前端 未结 2 372
耶瑟儿~
耶瑟儿~ 2021-01-13 13:05

Does NetworkStream.DataAvailable know whether the sender\'s send buffer is empty? Or does it simply indicate whether the receiver\'s read buffer has data? My assumption is t

相关标签:
2条回答
  • 2021-01-13 14:06

    If you are needing to know when the receiver has received all of the data for a particular message then you definitely need to length prefix.

    I typically define a struct similar to this that goes out at the front of any binary messages i send.

    struct Header
    {
      int packetIdentifier;
      int protocolVersion;
      int messageType;
      int payloadSize;
    }
    

    The identifier lets you determine if you have a valid message of your protocol type. The version lets you revision your protocol. The message type is the type of message (ie: CommsOnline). The payload size is the size of the body of the message.

    0 讨论(0)
  • 2021-01-13 14:10

    One side of a connection is not going to know whether the other side's send buffer is empty.

    DataAvailable only indicates whether there is incoming data to be read. You could use that prior to Read(), but it alone doesn't give you the information you want. It doesn't tell you the beginning and ending of each batch.

    I've coded back-and-forth conversation before, and I used length-prefixes in the data. What I did was write helper functions that read an exact number of bytes (chunks at a time) and no more.

    The only alternative to length-of-batch values in the stream is some way of examining the incoming data and recognizing the beginnings and endings of batches.

    0 讨论(0)
提交回复
热议问题