从 NetworkStream 读取时偏移有什么用?

问题描述

我用套接字编写了一个简单的回显服务器。在制作时我发现这两个代码给出了相同的结果。

  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 的第二种方法。