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

时间:2011-10-05 20:21:14

标签: c# sockets tcpclient

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

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

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

3 个答案:

答案 0 :(得分:7)

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

  

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

     

如果传输系统中没有可用的缓冲区空间来保存要传输的数据,则发送将阻止,除非套接字已置于非阻塞模式。在非阻塞流定向套接字上,写入的字节数可以在1和请求的长度之间,具体取决于客户端和服务器计算机上的缓冲区可用性。

假设write在下面调用send,那么对winsock文档的严格解释将表明没有保证数据在返回时将数据传递到管道的另一端。

以下是我引用的winsock文档的链接: http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=VS.85).aspx

答案 1 :(得分:1)

我不同意这两个答案[说明它阻止]。写入TCP / IP套接字不会阻止,除非底层缓冲区已经充满了未确认数据。通常,它不会阻塞,而只是传递给TCP实现。但是,当然现在我必须找到一些参考来支持这个:)

来自SO

答案 2 :(得分:-1)

TcpClient.Write将阻塞,直到数据包缓冲区已刷新到网络并且已收到相应的ACK。您会注意到,断开连接通常会在Write操作上抛出异常,因为它等待ACK但在定义的超时时间内没有得到ACK。