将流Socket.Receive块直到它填充缓冲区?

时间:2012-08-30 13:55:31

标签: .net sockets streaming

我想收到一个数据流。所以有时数据会枯竭。在这种情况下,如果Receive方法返回到目前为止收到的内容将会很好。

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

如果我明确传递一个尺寸参数会不会有意义?异步方法BeginReceive会有影响吗? (我想在这两种情况下行为都是一样的)

阅读this answer时,您似乎总是希望填充缓冲区,因为它会建议您执行while (bytesRead == bytesRequested)。但the MSDN documentation中的示例使用了while (bytesRead > 0)

1 个答案:

答案 0 :(得分:1)

网络堆栈将为您提供最少的可用内容(在内核中缓冲)和您提供的应用程序缓冲区的大小。这里的诀窍是,如果没有数据可用,常规接收将阻止,这就是你提供的那两个while语句之间的区别 - 第一个语句在短读时发生,可能表示您的下一次读取将被阻止,而第二次读取将查找流结束,即套接字从另一侧关闭。