[c# TCP socket] Clinet가 죽은것을 알아채기
<TCP 서버 에서 TCP클라이언트를 이용하는 상황에서..>
TcpClient 클래스 속성중 Connected 라는 속성이 있다. 말그대로 클라이언트가 살았는지 죽었는지
판단하는 속성인데 서버에서 잘 작동하지 않는다. ( 나만 잘 모르는 것일수도 있다.)
그리고 통상적으로 while 루프 안에 스트림을 읽어 오는 코드를 작성한다음
클라이언트 프로그램이 종료 되는경우를 TcpClient 클래스 속성중 Connected 를 이용하면
무한 루프에 빠진다.
해결책은 클라이언트로 오는 바이트 수가 "0" 인것을 확인하여 처리를 해주면 된다.
while(true) { /***중요***/ reciveByte = new byte[1024]; data = reader.ReadLine(); if(data == null) { Invoke(mrg , "클라이언트가 죽었습니다"); AceptClient(); break; } /*** 중요 ***/ else if(stream.Read(reciveByte , 0 , reciveByte.Length) == 0) { Trace.WriteLine("EXIT"); AceptClient(); break; } } /*** 중요 ***/ 라고 되어 있는 부분을 보면 된다.
byte[] 를 하나 만들어 Stream 의 Read 속성을 적용 시켜 주면 된다.
만약 공백이라면 "1" 바이트 를, 값이 날라오지 않는 경우라면 "0" 을 반환 함으로 Client가 죽었는것을 알수 있다.
추가로 첫번째 예외처리는 서버app 를 종료할때 생기는 에러를 대처하기 위함이다.
순간적으로 data 가 Null 값이 됨으로 while 를 탈출하게 해논것이다.
파일 전송중 클라이언트 사망을 눈치 채기 (2012,02,12)
http://scripter.co.kr/203
'C#' 카테고리의 다른 글
[C# ,쉬운 이터레이터 만들기] Yield 키워드 간단히 개념잡기 (188) | 2010.12.05 |
---|---|
[AS3 , C# ,Serialize]AS3 와 C#의 직렬화 비교 (90) | 2010.12.04 |
[c# TCP socket] Clinet가 죽은것을 알아채기 (68) | 2010.12.04 |
[C#]Dictionary foreach (67) | 2010.12.04 |
[Simple Text Writer V0.1] 간편한 파일 쓰기 어플 (65) | 2010.12.04 |
[WinForm] Graphic을 PictureBox에 넣어보자! (86) | 2010.12.04 |
C#
2010.12.04 03:51