문제

다음 예외를받습니다.

System.NotSupportedException : This stream does not support seek operations.
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.WriteByte(Byte value)

다음 링크는 이것이 Microsoft에게 알려진 문제임을 보여줍니다.http://connect.microsoft.com/visualstudio/feedback/viewfeedback.aspx?feedbackid=273186

이 스택 트레이스는 두 가지를 보여줍니다.

  1. System.io.bufferedstream은 터무니없는 포인터 이동 작업을 수행합니다. 완충 스트림은 기본 스트림을 버퍼링해야합니다. 그러한 수확 작업이 있으면 버퍼의 품질이 나쁩니다.
  2. SEEK를 지원하지 않는 스트림과 안정적으로 작동하지 않습니다.

대안이 있습니까? C#의 NetworkStream과 함께 버퍼가 필요합니까? 아니면 이미 버퍼링되었습니다.

편집 : 기본 소켓 스트림에 대한 읽기/쓰기 호출 수를 단순히 줄이고 싶습니다.

도움이 되었습니까?

해결책

해결책 두 개의 독립을 사용하는 것입니다 BufferedStreams, 하나는 수신을위한 것과 보내기를위한 하나. 그리고 보내는 것을 플러시하는 것을 잊지 마십시오 BufferedStream 적절하게.


2018 년에도 인류를 위해이 질문에 대한 만족스러운 답변을 얻기가 어려워 보입니다. 여기에 두 센트가 있습니다.

그만큼 NetworkStream ~이다 OS쪽에 버퍼링되었습니다. 그러나 이것이 .NET쪽에 버퍼링 할 이유가 없다는 것을 의미하지는 않습니다. TCP는 Write-Read (반복)에서 잘 작동하지만 ACK가 지연되어 쓰기 판 읽기의 마구간 등이 있습니다.

나와 같이 21 세기에 수많은 서브 파 프로토콜 코드를 가지고 있다면, 당신은 버퍼링을 원합니다.

또는, 위의 내용을 고수하면 읽기/RCV 만 버퍼링하거나 쓰기/보내기 만 사용하고 NetworkStream 코드가 얼마나 깨진 지에 따라 다른쪽에 직접. 당신은 일관성이 있어야합니다!

BufferedStream 문서는 풍부하게 분명하게 만들지 못합니다. 스트림을 찾을 수있는 경우 읽기 및 쓰기 만 스위치 만. 버퍼가 동일한 버퍼로 읽고 쓰기 때문입니다. BufferedStream 단순히 잘 작동하지 않습니다 NetworkStream.

Marc가 지적했듯이,이 절름발이의 원인은 두 개의 스트림을 .NET의 가장 큰 설계 결정 중 하나가 아닌 하나의 네트워크 스트림으로 혼합 한 것입니다.

다른 팁

NetworkStream은 이미 버퍼링되었습니다. 수신 된 모든 데이터는 읽기를 기다리는 버퍼에 보관됩니다. 읽기 통화는 매우 빠르거나 네트워크의 다른 피어로부터 데이터가 수신되기를 기다리는 것이 매우 빠르며, 버퍼링 스트림은 어느 경우에도 도움이되지 않습니다.

차단에 대해 걱정하는 경우 기본 소켓을 비 블로킹 모드로 전환하는 것을 볼 수 있습니다.

BufferedStream 단순히 기본 스트림 (IO/하드웨어 바운드)에 대한 읽기/쓰기 호출 수를 줄이기 위해 작용합니다. 그것은 탐구 능력을 제공 할 수 없다 (실제로 버퍼링과 추구는 여러 가지면에서 서로 반대한다).

왜 찾아야합니까? 아마도 스트림을 먼저 찾는 무언가에 복사 할 것입니다 - MemoryStream 또는 a FileStream - 그런 다음, 그 두 번째로 찾을 수있는 스트림에서 실제 작업을 수행하십시오.

특정 목적을 염두에두고 있습니까? 자세한 내용은 더 많은 적절한 옵션을 제안 할 수 있습니다 ...

특히 : 그 점에 유의하십시오 NetworkStream 호기심입니다 - 대부분의 스트림에서 읽기/쓰기는 동일한 물리적 스트림과 관련이 있습니다. 그러나 a NetworkStream 실제로 완전히 독립적 인 두 개의 파이프를 나타냅니다. 읽기와 쓰기는 완전히 관련이 없습니다. 마찬가지로, 당신은 이미 당신을 지나친 바이트로 찾을 수 없습니다 ... 당신은 할 수 있습니다. 건너 뛰기 데이터이지만 몇 가지를 수행하여 수행하는 것이 좋습니다. Read OPDRATION 및 데이터 폐기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top