Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';从NetworkStream读取时使用偏移量是什么?_C#_Sockets_Network Programming_Networkstream - Fatal编程技术网

C# 什么';从NetworkStream读取时使用偏移量是什么?

C# 什么';从NetworkStream读取时使用偏移量是什么?,c#,sockets,network-programming,networkstream,C#,Sockets,Network Programming,Networkstream,我编写了一个带有套接字的简单echo服务器。在制作过程中,我发现这两个代码给出了相同的结果 var buffer = new byte[bytesToRead]; var bytesRead = 0; while (bytesRead < bytesToRead) { var bytesReceived = await networkStream.ReadAsync(buffer, 0, (bytesToRead

我编写了一个带有套接字的简单echo服务器。在制作过程中,我发现这两个代码给出了相同的结果

  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=新字节[bytesToRead];
var bytesRead=0;
while(bytesRead

var buffer=新字节[bytesToRead];
var bytesRead=0;
while(bytesRead
区别在于我总是设定

偏移量=0

另一方面,我设置了

偏移量=字节读取

(偏移量是networkStream.ReadAsync(字节[]缓冲区,int偏移量,int计数)的第二个参数)

所以我的结论是,当两个代码都工作时,偏移量是多少并不重要,但是这两个代码是如何工作的呢


在网络流中是否忽略偏移量?

如注释中所述,在流中,第二个参数是缓冲区数组中的偏移量,而不是流,这意味着如果保留偏移量0,则将覆盖缓冲区。网络流也不允许搜索。 我得到了相同的结果,因为我在非常短的消息长度上尝试了这个方法,在这种情况下,循环有效地运行了一次迭代来读取整个消息,所以这两个代码片段似乎给出了相同的结果。我在一条更长的消息上尝试了它,结果发生了变化


因此,正确的方法是我使用偏移量作为字节读取的第二种方法。

流第二个参数是进入缓冲区数组的偏移量。因此,如果使用整个缓冲区,则从零开始读取整个长度。如果从位置2开始,则必须读取数组长度减去2。第一个代码段看起来是错误的,因为您总是从偏移量0开始,但读取的长度不同;但是,您可能会在非常短的消息长度上尝试此操作,在这种情况下,循环会有效地运行一次迭代来读取整个消息,因此这两个代码片段似乎给出了相同的结果。请在更长的消息上试用。@CoolBots是的,更正结果与大数据不同,我认为偏移量用于流,但用于缓冲区。谢谢大家,酷机器人和jdweng。
 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;