2010-06-18 6 views
1

열려있는 TCP 연결이 있고 NetworkStream.BeginRead()를 사용하여 읽었습니다. 한쪽 끝에서 연결이 닫히면 콜백이 호출되고 스트림 객체는 쓸모가 없습니다. 문서가 말한 것처럼 EndRead()는이 경우에 따라 IOException 또는 ObjectDisposedException을 던집니다.. NET NetworkStream을 닫았습니다. 모든 데이터를 읽는 방법은 무엇입니까?

내가 마지막으로 성공한 EndRead (및 다시 BegingRead)와 연결 해제 사이에 누락 된 데이터가 없다는 보장이 있습니까? 그렇지 않은 경우 연결이 끝날 때를 대비하여 연결을 끊을 때 수동으로 NetworkStream.Read()를 실행하여 읽지 않은 상태로 두지 않아야합니까?

답변

2

이 경우 사용할 패턴은 BeginRead를 사용하여 스트림을 읽는 것과 정확히 동일하며 콜백 메소드에서 '더 많은 데이터를 스트림으로'처리 할 수 ​​있습니다.
콜백 메서드는 EndRead를 호출하고 스트림에서 읽은 데이터를 (보통 StringBuilder 인스턴스에 추가하여) 으로 수집 한 다음 BeginRead를 다시 호출합니다 (). EndRead가 0 바이트를 반환하자마자 스트림에서 더 이상 읽을 데이터가 없다는 것을 보증합니다. 여기

당신이 유용 수있는 문서입니다 : Using async client sockets

내가 어디 거기에 구체적으로 0 바이트 반환 보장이라고 언급 않은 것으로 나타났습니다, 그래서 여기에 혼란을 이해하지만 예는 매우 분명하다 그것은 독서를 그만 둘 신호입니다.

+0

우 - 후! 나는 맞는 물건을 안다. 그러나 절대적으로 아무도 다른 사람을 확인하거나 부인할만큼 충분하지 않다! 어, 잠깐, 왜 내가 이걸로 행복하니? – Task

+0

아마도이 (매우 관련된) 질문에 대한 답이되기를 희망합니다. EndRead가 End bytes를 호출하는 유일한 방법이 'BeginRead'에 대한 콜백에 있다면, EndRead는 0 바이트를 읽을 수 있습니다. 실행하려면 데이터를 전송해야합니까? 방금 제로 바이트 응답을 보내야합니까? – Brandon

+0

글쎄, 이제는 스트림에서 읽는 대신에 글쓰기 *에 대해 이야기하고있는 것입니다. 그것은 다소 다릅니다. 연결할 수있는 공개 질문이 있으십니까? 본질적으로 0 바이트를 특별히 쓸 필요는 없으며 응답을 완료하면됩니다. – Task