gpt4 book ai didi

c# - NetworkStream不支持查找操作

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:45 24 4
gpt4 key购买 nike

我正在创建简单的代理服务器,但遇到一个奇怪的情况,我正在执行以下代码:

var clientRequestStream = _tcpClient.GetStream();
var requestHeader = clientRequestStream.GetUtf8String();
GetUtf8StringStream类的扩展方法,该类读取流(包含 HttpRequest header )。我需要提取那些 header 以访问Host和Requested Url。一旦读取NetworkStream,就完成了。我需要执行搜索操作并设置其 clientRequestStream.Position = 0;,因为我必须读取该流并将其写入另一个远程 NetworkStream上。

我不知道该如何解决这个问题。任何建议都将对您有所帮助。

编辑:我也尝试将NetworkStream复制到MemoryStream,然后在MemoryStream上执行查找操作,没有异常(exception),但是当我想从NetworkStream读取时,其缓冲区始终为空。

我也使用了反射器来查看 Stream.CopyTo里面发生了什么。见下面的代码:
    private void InternalCopyTo(Stream destination, int bufferSize)
{
int num;
byte[] buffer = new byte[bufferSize];
while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
{
destination.Write(buffer, 0, num);
}
}

这就是CopyTo所做的。即使我使用 CopyTo,问题仍然无法解决。因为它将源(Here NetworkStream)读取到末尾。我还有另一种方法来处理这种情况吗?

最佳答案

您是否正在从此流中阅读直到结束?如果是这样,我建议您将整个内容复制到MemoryStream,然后可以将其复制到您内心的内容上。在.NET 4中,使用 Stream.CopyTo 尤其容易:

MemoryStream dataCopy = new MemoryStream();
using (var clientRequestStream = _tcpClient.GetStream())
{
clientRequestStream.CopyTo(dataCopy);
}
dataCopy.Position = 0;
var requestHeader = dataCopy.GetUtf8String();

使得 NetworkStream不可搜索是有道理的-它只是服务器向您提供的数据流。除非您可以告诉服务器倒带(这仅在某些情况下才有意义),否则无法进行搜索,除非某些内容会缓冲您需要倒带的数据-这基本上就是复制到 MemoryStream所做的事情,这简直是蛮荒的-力时尚。

关于c# - NetworkStream不支持查找操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11749036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com