问题描述
我用套接字编写了一个简单的回显服务器。在制作时我发现这两个代码给出了相同的结果。
var buffer = new byte[bytesToRead];
var bytesRead = 0;
while (bytesRead < bytesToRead)
{
var bytesReceived = await networkStream.ReadAsync(buffer,(bytesToRead - bytesRead))
.ConfigureAwait(false);
if (bytesReceived == 0)
throw new Exception("Socket Closed");
bytesRead += bytesReceived;
}
return buffer;
var buffer = new byte[bytesToRead];
var bytesRead = 0;
while (bytesRead < bytesToRead)
{
var bytesReceived = await networkStream.ReadAsync(buffer,bytesRead,(bytesToRead - bytesRead))
.ConfigureAwait(false);
if (bytesReceived == 0)
throw new Exception("Socket Closed");
bytesRead += bytesReceived;
}
return buffer;
不同之处在于我总是设置
偏移=0
另一个是我设置的
偏移=字节读取
(偏移量是 networkStream.ReadAsync(byte[] buffer,int offset,int count) 的第二个参数)。
所以我得出的结论是,偏移量是多少并不重要,因为两个代码都可以工作,但是这两个代码是如何工作的?
网络流中是否忽略偏移量?
解决方法
正如评论中提到的,在流中,第二个参数是缓冲区数组的偏移量,而不是流这意味着如果你保持偏移量为 0,那么你将覆盖缓冲区。网络流也不允许搜索。 我得到了相同的结果,因为我在非常短的消息长度上尝试这个,在这种情况下,循环有效地运行一次迭代来读取整个消息,所以 2 个代码片段似乎给出了相同的结果。我对更长的消息进行了尝试,结果发生了变化。
所以,正确的方法是我使用 offset 作为 bytesRead 的第二种方法。