【问题标题】:Until when does NetworkStream.Write block?NetworkStream.Write 阻塞到什么时候?
【发布时间】:2011-09-09 21:30:00
【问题描述】:

我能想到这些可能的答案:

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

【问题讨论】:

    标签: c# .net tcp io networkstream


    【解决方案1】:

    直到数据写入发送方的发送缓冲区。
    所以如果缓冲区满了,就会阻塞。

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

    你可以做一个实验:做一个发送者和接收者,将发送者的套接字发送缓冲区设置为小,接收者的接收缓冲区设置为小。

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

    【讨论】:

      【解决方案2】:

      NetworkStream 不缓冲数据。最终,对NetworkStream.Write 的调用将转换为套接字send 函数调用。此功能的 MSDN 文章说:

      成功完成一次发送 功能并不表示 数据已成功交付并 收到给收件人。这 函数只表示数据是 发送成功。

      这能回答你的问题吗?

      【讨论】:

      • NetworkStream 不缓冲数据,但 Socket.Send 将数据放入内部缓冲区。
      • @Alex Aza:我正在用反射器观察它,不,它没有。我在看 .net 4.0 的实现,你在说什么 .net 版本?
      • 但是底层实现是做什么的呢?即,Windows IP 堆栈是否会短时间缓冲数据?
      猜你喜欢
      • 2011-12-01
      • 2013-02-19
      • 2019-09-04
      • 2013-05-28
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      相关资源
      最近更新 更多