繁体   English   中英

什么条件导致NetworkStream.Write阻塞?

[英]What conditions cause NetworkStream.Write to block?

NetworkStream.Write只会阻塞它将数据发送到TCP发送缓冲区,还是会阻塞,直到接收主机实际确认数据为止?

注意:套接字配置为阻止I / O.

编辑:哎呀,当然没有TcpClient.Write这样的东西! 我们都明白我们在谈论TcpClient.GetStream().Write ,实际上是NetworkStream.Write

除非.net使用的不是winsock,否则根据winsock参考:

成功完成发送功能并不表示数据已成功发送并接收到收件人。 此功能仅表示数据已成功发送。

如果传输系统中没有可用的缓冲区空间来保存要传输的数据,则发送将阻止,除非套接字已置于非阻塞模式。 在非阻塞流定向套接字上,写入的字节数可以在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操作上抛出异常,因为它等待ACK但在定义的超时时间内没有得到ACK。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM