【问题标题】:will streaming Socket.Receive block until it fills the buffer?流式传输 Socket.Receive 会阻塞直到它填满缓冲区?
【发布时间】:2012-08-25 06:43:07
【问题描述】:

我想接收数据流。因此,有时数据可能会枯竭。在这种情况下,如果 Receive 方法返回它到目前为止收到的内容,那就太好了。

当我使用 .Net Socket 并将其称为 Receive 方法时,该调用是否会阻塞,直到它能够完全填满缓冲区?或者它会在它能够返回至少 1 个字节后立即返回吗? (假设套接字没有关闭)

如果我明确地传递一个大小参数,这有关系吗?异步方法BeginReceive 会有什么影响吗? (我猜这两种情况下的行为都是一样的)

在阅读this answer 时,您似乎应该总是期望缓冲区被填满,因为它建议您执行while (bytesRead == bytesRequested)。但是the MSDN documentation 中的一个示例使用了while (bytesRead > 0)

【问题讨论】:

    标签: .net sockets streaming


    【解决方案1】:

    网络堆栈将为您提供可用的最小资源(在内核中缓冲)以及您提供的应用程序缓冲区的大小。这里的技巧是,如果 no 数据可用,常规接收将阻塞,这就是您提供的这两个 while 语句之间的区别 - 第一个在短读时中断,这可能表明您的下一次读取将阻塞,而第二次读取将查找流尾,即从另一侧关闭的套接字。

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多