什么条件导致NetworkStream.Write阻塞?
NetworkStream.Write
只会阻塞它将数据发送到TCP发送缓冲区,还是阻塞直到接收主机实际确认数据为止?
注意:套接字配置为阻止I / O.
编辑:哎呀,当然没有TcpClient.Write
这样的东西! 我们都明白我们在谈论TcpClient.GetStream().Write
,实际上是NetworkStream.Write
!
除非.net使用的是winsock以外的东西,否则根据winsock参考:
成功完成发送function并不表示数据已成功传送并接收给收件人。 此function仅表示数据已成功发送。
如果传输系统中没有可用的缓冲区空间来保存要传输的数据,则发送将阻止,除非套接字已置于非阻塞模式。 在非阻塞流定向套接字上,写入的字节数可以在1和请求的长度之间,具体取决于客户端和服务器计算机上的缓冲区可用性。
假设write在下面调用send,那么对winsock文档的严格解释将表明没有保证数据在返回时将数据传递到管道的另一端。
这是我引用的winsock文档的链接: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms741416( v = VS.85) .aspx
我不同意这两个答案[说明它阻止]。 除非底层缓冲区已满了未确认数据,否则写入TCP / IP套接字不会阻塞。 通常,它不会阻塞,而只是传递给TCP实现。 但是当然现在我必须追踪一些参考来支持这个:)
来自SO
TcpClient.Write
将阻塞,直到数据包缓冲区已刷新到网络并且已收到相应的ACK。 您会注意到,断开连接通常会在Write
操作上抛出exception,因为它等待ACK但在定义的超时时间内没有得到ACK。