NetworkStream.Write阻塞到什么时候?

4

我可以想到以下可能的答案:

  • 直到数据被写入IP堆栈中的某个内部缓冲区。
  • 直到数据被发送到网络上。
  • 直到从另一台机器接收到接收确认。
2个回答

4

在发送方将数据写入发送缓冲区之前,数据是不会被发送的。
因此,如果缓冲区已满,它将被阻塞。

如果由于网络问题或接收方接收缓冲区已满而未传输数据,则发送缓冲区可能已满。

您可以进行一项实验:创建一个发送方和一个接收方,将发送方套接字的发送缓冲区设置为较小值,将接收方的接收缓冲区也同样设置为较小值。

开始发送数据,在接收方接受连接后,但不要接收数据。当发送的字节数约为SenderSendBuffer + ReceiverReceiveBuffer时,套接字将被阻塞。


0

NetworkStream 不会缓存数据。最终,对 NetworkStream.Write 的调用将转换为套接字 send 函数调用。该函数的 MSDN 文章如下所述:

发送函数的成功完成并不表示数据已成功传递和接收到接收方。此函数仅表示数据已成功发送。

这回答了你的问题吗?


NetworkStream不会缓存数据,但是Socket.Send会将数据放入内部缓冲区。 - Alex Aza
@Alex Aza:我正在使用反编译器查看它,不,它没有。我正在查看.NET 4.0实现,你在谈论哪个.NET版本? - Andrew Savinykh
但是底层实现是做什么的呢?也就是说,Windows IP堆栈是否会缓冲数据一段时间? - Jim Mischel

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