NetworkStream:ReadTimeout及其效果Read()

时间:2017-10-13 08:52:51

标签: c# networking tcp networkstream

我对如何使用ReadTimeout以及它如何影响Read()感到困惑。

尝试读取网络流时,有3种情况,假设我们正在尝试读取X个字节:

  1. 数据可用,字节< X
  2. 数据可用,bytes = X
  3. 数据可用,字节> X
  4. 没有可用的数据,ReadTimeout> 0
  5. 没有可用数据,ReadTimeout = 0
  6. 文档有点模棱两可,未在ReadTimeout调用中明确提及Read(),或ReadTimeout是否会影响Read()来电。

      

    此方法将数据读入buffer参数并返回成功读取的字节数。如果没有可用于读取的数据,则Read方法返回0. Read操作读取尽可能多的数据,最多为size参数指定的字节数。

    我理解的是上述5种情况:

    1. Read()将以X字节读取并立即返回。 ReadTimeout并不重要
    2. Read()将读取X个字节并返回
    3. Read()将读取X个字节并返回。需要再次调用read来读取剩余的X字节。
    4. 致电Read()将等待ReadTimeout段数据。
    5. Read()将立即返回0。
    6. 如果有人能给出一些澄清,我将非常感激。

      谢谢。

1 个答案:

答案 0 :(得分:1)

如果查看source for NetworkStream,您会看到您的方案1 - 4和理解是正确的(NetworkStream只是在套接字上调用read())。过期超时的结果是IOException,内部SocketException指示超时。

场景5不适用:读取时间为零不能存在,它是减1(-1,意味着无限)或> = 1.所以情景。 5将永远阻塞或获得一个IOException,内部SocketException指示一些错误。