我想收到一个数据流。所以有时数据会枯竭。在这种情况下,如果Receive
方法返回到目前为止收到的内容将会很好。
当我使用.Net Socket
并将其称为Receive
方法时,是否会调用阻塞直到它能够完全填充缓冲区?或者它会在能够返回至少1个字节后立即返回? (假设套接字未关闭)
如果我明确传递一个尺寸参数会不会有意义?异步方法BeginReceive
会有影响吗? (我想在这两种情况下行为都是一样的)
阅读this answer时,您似乎总是希望填充缓冲区,因为它会建议您执行while (bytesRead == bytesRequested)
。但the MSDN documentation中的示例使用了while (bytesRead > 0)
答案 0 :(得分:1)
网络堆栈将为您提供最少的可用内容(在内核中缓冲)和您提供的应用程序缓冲区的大小。这里的诀窍是,如果没有数据可用,常规接收将阻止,这就是你提供的那两个while
语句之间的区别 - 第一个语句在短读时发生,可能表示您的下一次读取将被阻止,而第二次读取将查找流结束,即套接字从另一侧关闭。