从 NetworkStream 读取时偏移量有什么用?
What's the use of offset while reading from NetworkStream?
我用套接字写了一个简单的回显服务器。在制作过程中我发现这两个代码给出了相同的结果。
var buffer = new byte[bytesToRead];
var bytesRead = 0;
while (bytesRead < bytesToRead)
{
var bytesReceived = await networkStream.ReadAsync(buffer, 0, (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;
区别在于我总是设置
offset=0
另一边我设置
offset=bytesRead
(offset 是 networkStream.ReadAsync(byte[] buffer,int offset,int count) 的第二个参数。
所以我得出的结论是,偏移量是多少并不重要,因为两种代码都可以工作,但是这两种代码是如何工作的?
网络流中是否忽略偏移量?
如评论中所述,在流中,第二个参数是缓冲区数组中的偏移量而不是流这意味着如果您保持偏移量为 0,那么您将覆盖缓冲区。网络流也不允许搜索。
我得到了相同的结果,因为我在非常短的消息长度上进行了尝试,在这种情况下,循环有效地运行了一次迭代来读取整个消息,因此 2 个代码片段似乎给出了相同的结果。我在更长的消息上尝试了它,结果发生了变化。
所以,正确的方法是我使用offset作为bytesRead的第二种方法。
我用套接字写了一个简单的回显服务器。在制作过程中我发现这两个代码给出了相同的结果。
var buffer = new byte[bytesToRead];
var bytesRead = 0;
while (bytesRead < bytesToRead)
{
var bytesReceived = await networkStream.ReadAsync(buffer, 0, (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;
区别在于我总是设置
offset=0
另一边我设置
offset=bytesRead
(offset 是 networkStream.ReadAsync(byte[] buffer,int offset,int count) 的第二个参数。
所以我得出的结论是,偏移量是多少并不重要,因为两种代码都可以工作,但是这两种代码是如何工作的?
网络流中是否忽略偏移量?
如评论中所述,在流中,第二个参数是缓冲区数组中的偏移量而不是流这意味着如果您保持偏移量为 0,那么您将覆盖缓冲区。网络流也不允许搜索。 我得到了相同的结果,因为我在非常短的消息长度上进行了尝试,在这种情况下,循环有效地运行了一次迭代来读取整个消息,因此 2 个代码片段似乎给出了相同的结果。我在更长的消息上尝试了它,结果发生了变化。
所以,正确的方法是我使用offset作为bytesRead的第二种方法。