article search result of 'TCPListener' : 1

  1. 2010.12.04 [c# TCP socket] Clinet가 죽은것을 알아채기 (68)

[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

Yamecoder 야매코더_
C# 2010.12.04 03:51
Powerd by Tistory, designed by criuce
rss