2009-06-17 4 views
3

나는 ... 나는 다음과 코드를 작성하도록 소켓 버퍼를 읽어 비워차단하지 않고 NetworkStream.Read()를 호출하는 방법?

byte[] tempBuffer = new byte[1024]; 
int readCount = 0; 
while ((readCount = tcpSocket.GetStream().Read(tempBuffer, 0, tempBuffer.Length)) != 0) 
{ 
    // do with tempBuffer 
} 

그러나 읽기() 메소드를하고 싶습니다 그래서 차단 나는 tcpSocket.ReceiveTimeout = 1을 추가;. 이전과 마찬가지로 작동합니다.

아시다시피, 이것은 일반적으로 C++에서 사용됩니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

4

DataAvailable 속성을 사용하면 Read 메서드를 호출하기 전에 읽을 내용이 있는지 확인할 수 있습니다.

+0

분리를 감지하기 위해 try-catch 블록으로 코드를 래핑했습니다. DataAvailable 속성을 사용하면 어떻게 할 수 있습니까? –

+0

내 대답에서 DataAvailable 메서드에 대한 링크를 따라 가면 원하는 코드 예제가 있음을 알 수 있습니다. 물론 분리를 처리하기 위해 모든 것을 try-catch로 감쌀 수 있습니다. –

2

대신 GetStream()를 사용하는 직접 NetworkStream.Read() 기능을 사용

데이터가 읽을 수없는 경우

, 는 읽기 방법을 사용할 수 같이 읽기 작업이 많은 데이터를 읽고 0 을 반환 size 매개 변수로 지정된 최대 바이트 수인 . 원격 호스트가 연결을 종료하고 사용 가능한 모든 데이터가 인 경우 Read 메서드 이 즉시 완료되고 0을 반환합니다. 바이트입니다. 참고 :

+0

** ** 기능을 직접 사용하면 무엇을 의미합니까? 정적 멤버 함수가 없습니다. 제발 몇 가지 코드를 보자. –

+0

은 정적 함수가 아닙니다. 내가 제공 한 MSDN 링크를 읽었다면이 메서드가 NetworkStream 개체의 메서드라는 것을 알았을 것입니다. 'tcpSocket' 변수의 실제 유형을 제공하지 못했기 때문에 나머지 텍스트에서 추측해야했습니다. –

+4

당신이 여기서 무슨 말을하고 있는지 확실하지 않습니다. OP는 실제로'tcpSocket.GetStream()'을 통해 NetworkStream 객체를 사용하고 있습니다. – danyim

1

왜 버퍼를 비우고 싶습니까? 소켓 내용을 닫지 않으려면. 현재 내용을 원하지 않지만 나중에 데이터가 필요할 경우 나중에 시작할 때 어떻게 알 수 있습니까? 데이터가 캡슐화되지 않은 스트림 인 경우 ...

잘못된 방식으로 문제를 해결하는 것처럼 들립니다.

+0

버퍼를 비우는 것이 의미하는 것은 단지 버퍼에서 모든 데이터를 읽고이를 무시하고 건너 뛴다는 것입니다. 보통 나는 서버를 만들 때 이렇게합니다. –

관련 문제