2012-08-30 39 views
0

我想收到一串数据。所以有时数据可能会枯竭。在那种情况下,如果Receive方法返回到目前为止所收到的内容,那将会很不错。将流式传输Socket.Receive块,直到它填充缓冲区?

当我使用.Net Socket,我把它称为Receive方法,将调用块,直到它能够完全填充缓冲区?或者一旦能够返回至少1个字节,它会立即返回? (假设套接字未关闭)

难道问题,如果我通过一个尺寸参数明确?异步方法BeginReceive会有什么影响吗? (我猜在这两种情况下,行为将是相同的)

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

回答

1

网络堆栈将为您提供可用(在内核中缓冲)和您提供的应用程序缓冲区大小的最小值。这里的技巧是,经常收到如果没有数据可用但将阻止,这就是你提供这两个while语句之间的差别 - 第一个爆发在很短的读取,这可能表明你的下一个读将阻塞,而第二个查找流结束,即从另一侧关闭插座。