NetworkStream.Read三种行为场景澄清:阻塞、返回0、抛出IOException
NetworkStream.Read三种行为的触发时机详解
折腾过NetworkStream.Read的人都懂,官方文档的描述和实际表现确实有出入,我把三种核心场景的触发时机给你讲得明明白白:
1. 何时会阻塞?
- 当套接字连接处于正常活跃状态,且当前没有任何可读取的数据时,
Read方法会进入阻塞状态。 - 这里要纠正文档的模糊表述:文档说“若无数据可读,Read方法返回0”,但这个描述的前提是连接已经被正常关闭;如果只是暂时没数据、连接还活着,
Read会一直等待,直到有数据抵达,或者连接状态发生变化(比如对方关闭连接)。
2. 何时返回0字节?
- 只有当对方通过TCP正常关闭连接(发送FIN包),并且你已经读取完了该连接上所有剩余的数据后,下一次调用
Read才会返回0。 - 这个返回值是TCP协议的“正常结束”信号,代表对方不会再发送任何数据,此时
Read不会阻塞,直接返回0。
3. 何时抛出IOException?
- 当连接发生异常中断时,比如对方强制关闭套接字(发送RST包)、网络突然断开、本地套接字被意外关闭,或者读取过程中出现底层网络错误,
Read就会抛出IOException。 - 另外,如果在调用
Read之前,你已经手动关闭了NetworkStream(比如调用Close()或Dispose()方法),此时调用Read也会触发这个异常。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

