网络流:ReadTimeout的作用和Read()函数

3
我对ReadTimeout的使用方式和它如何影响Read()方法感到困惑。
在尝试读取网络流时,有三种情况,假设我们正在尝试读取X个字节:
1. 数据可用,并且字节数小于X。 2. 数据可用,并且字节数等于X。 3. 数据可用,并且字节数大于X。 4. 没有可用数据,并且ReadTimeout > 0。 5. 没有可用数据,并且ReadTimeout = 0。
文档有点模糊,没有明确提及Read()调用中的ReadTimeout,或者ReadTimeout是否根本影响Read()调用。
这个方法将数据读入缓冲区参数并返回成功读取的字节数。如果没有可读数据,则Read方法返回0。Read操作读取尽可能多的数据,最多可以达到size参数指定的字节数。
我理解以上5种情况: 1. Read()将读取X个字节并立即返回。ReadTimeout无关紧要。 2. Read()将读取X个字节并返回。 3. Read()将读取X个字节并返回。需要再次调用read以读取其余的X个字节。 4. 对Read()的调用将等待ReadTimeout时间段以获取数据。 5. Read()将立即返回0。
如果有人能够给出一些澄清,我将不胜感激。
谢谢。

1
"Read()"会阻塞直到有数据可用或另一端关闭连接。我认为文档在这里非常误导,说“如果没有可读取的数据,Read方法将返回0”。 - C.Evenhuis
2
你需要阅读 ReadTimeout 的文档:“读取操作等待数据的时间量”。Read() 实际上会阻塞调用者,直到收到足够的数据复制到缓冲区。除非出现错误(你得到 0 字节)或超时(你得到少于你要求的字节数)。 - Sinatr
2
实际上,Read在超时时会抛出异常,因此我不知道它何时会返回较少的内容。阻塞部分是正确的 - Sinatr
谢谢大家。现在很清楚了。 - madu
1个回答

1
如果您查看NetworkStream源代码,您会发现您的情况1-4和理解是正确的(NetworkStream只是在套接字上调用read())。超时过期的结果是一个IOException,其中包含一个指示超时的内部SocketException。
情况5不适用:ReadTimeout为零是不存在的,它要么是负数(-1,表示无限),要么是>=1。因此,情况5将永远阻塞或获得一个带有内部SocketException指示某些错误的IOException。

谢谢Gonzalez!现在很清楚了。 - madu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接