2012-07-31 2 views
1

나는 간단한 프록시 서버를 만드는거야하지만 난 이상한 상황에 직면을 추구 지원하지 않습니다, 나는 다음과 같은 한 코드 :는 NetworkStream이 작업

var clientRequestStream = _tcpClient.GetStream(); 
var requestHeader = clientRequestStream.GetUtf8String(); 

GetUtf8String이 스트림을 읽어 Stream 클래스의 확장 방법 (포함 HttpRequest 헤더). 호스트 및 요청 된 URL에 액세스하려면 해당 헤더를 추출해야합니다. NetworkStream을 읽으면 완료됩니다. 검색 작업을 수행하고 해당 스트림을 읽고 다른 원격 NetworkStream에 기록했기 때문에 clientRequestStream.Position = 0;을 설정해야합니다.

나는이 문제를 어떻게 해결해야하는지 모른다. 어떤 조언이 도움이 될 것이다.


편집 : 나는 또한 시도 카피는 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); 
     } 
    } 

이것은 CopyTo가 수행하는 작업입니다. CopyTo을 사용해도 문제가 해결되지 않았습니다. 그것은 소스 (여기 NetworkStream)를 끝까지 읽으므로. 이 상황을 처리 할 또 다른 방법이 있습니까?

답변

4

이 스트림에서 끝까지 읽으십니까? 그렇다면 전체 내용을 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에 복사하면 예쁜 brute-force fashion.

+0

Jon 저는 NetworkStream에 NetworkStream을 복사했지만 버퍼가 항상 비어 있음을 읽고 싶습니다. – saber

+0

존 또한 CopyTo를 테스트했지만 버퍼를 MemoryStream에 복사하는 데 하루가 걸립니다. 나는 이유를 모른다. – saber

+0

@SaberAmani : 네트워크 스트림에 무엇이 있습니까? 서버가 연결을 계속 유지하면 복사가 완료되지 않습니다. 귀하의 첫 번째 의견에 관해서는 - 그것은 당신이 데이터를 올바르게 복사하지 않았 음을 암시합니다. 코드를 보지 않고 어떻게 말하기는 어렵습니다. –

2

발견 한대로 NetworkStream은 검색 할 수 없습니다.
NetworkStream은 네트워크에서 직접 데이터를 제공합니다.

데이터를 읽고 MemoryStream으로 다시 사용하십시오.

+0

게시물을 편집하고 있습니다. – saber

+0

MemoryStream을 NetworkStream에 할당 할 수 없습니다. MemoryStream을 직접 사용해야합니다. – SLaks

+0

CopyTo도 테스트했지만 버퍼를 MemoryStream에 복사하는 데 하루가 걸립니다. 나는 이유를 모른다. – saber

1

이 가장 쉬운 방법은 첫째 MemoryStream을 위해 스트림을 복사하는 것입니다 ... 당신은 제대로 추구가 필요하지 귀하의 GetUtf8String 방법을 다시하고 싶지 않은 가정하고 당신이 가진 것보다 당신만큼을 추구 할 수 스트림 필요. Stream.CopyTo은 복사를 처리합니다. (.Net4 +)

Position 속성을 0 (copiedStream.Position=0)으로 설정하거나 버퍼 및 길이를 기반으로 새 속성 (읽기 전용)을 만들어 스트림을 복제하여 MemoryStream 결과를 다시 얻어야합니다. 제 1 메모리 스트림

+0

나는 게시글을 편집합니다. – saber

+0

@SaberAmani, Updated. Jon Skeet의 대답 (+1)에는 필요한 정확한 코드가 들어 있습니다. –

+0

CopyTo도 테스트했지만 MemoryStream에 버퍼를 복사하는 데 하루가 걸리므로 응용 프로그램이 복사 할 위치에서 멈 춥니 다. 나는 이유를 모른다. – saber