sab*_*ber 1 .net c# sockets network-programming tcpclient
我正在创建简单的代理服务器,但遇到了一个奇怪的情况,我有以下代码:
var clientRequestStream = _tcpClient.GetStream();
var requestHeader = clientRequestStream.GetUtf8String();
Run Code Online (Sandbox Code Playgroud)
GetUtf8String是Stream读取流(包含HttpRequest标题)的类的扩展方法。我需要提取这些标头以访问主机和请求的 URL。完成读取 NetworkStream 后。我需要执行搜索操作并设置它,clientRequestStream.Position = 0;因为我必须读取该流并将其写入另一个远程NetworkStream.
我不知道我应该如何解决这个问题。任何建议都会有所帮助。
编辑:我也尝试将 NetworkStream 复制到 MemoryStream 然后对 MemoryStream 执行查找操作,没有例外,但是当我想从 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);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是 CopyTo 所做的。即使我使用CopyTo问题仍然没有解决。因为它将源(此处为 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();
Run Code Online (Sandbox Code Playgroud)
NetworkStream不可搜索是有意义的- 它只是服务器提供给您的数据流。除非您可以告诉服务器倒带(这甚至仅在某些情况下才有意义),否则无法进行查找,除非某些东西缓冲了您需要倒带的数据——这基本上就是复制到 aMemoryStream所做的,非常暴力时尚。
| 归档时间: |
|
| 查看次数: |
5559 次 |
| 最近记录: |