본문 바로가기

옛글/Silverlight

소켓통신중에 서버가 close 되었을 때 오류처리

반응형
















서버가 종료되거나 중간에 케이블이 빠지거나 네트워크가 끊기면

소켓의 OnReceive 이벤트(보통 데이터 수신 콜백)에서 다음과 같이 해주면 정상적으로 오류 처리되니

참고하세요.

처음에는 모르고 " if (e.BytesTransferred < 0) "이렇게 했더니 IE가 무한루프에 빠집니다. Blocking상태가 되더라구요.

소켓 에러가 나면 e.BytesTransferred에 0값이 들어갑니다. 그래서 반드시

소켓 종료나 오류체크는  if (e.BytesTransferred <=0) 하면 무한루프에 빠지지 않고 종료처리할수 있어요.

C/C++ , MFC만 하다가 실버라이트 처음 접해보니 좋습니다. 배우는 시간도 샘플 프로그램 몇개 돌려보면

알수 있습니다.  시스템 프로그램은 MFC로 하고 웹 어플리케이션은 실버라이트가 최고네요.

서버도 기존에 개발해노흔게 있다면 프로토콜부분만 XML이나 문자열기반으로 수정한후 실버라이트 클라이언트와

통신하는 구조로 하면 좋아요. 웹서버도 아무거나 쓰면 되고요.... 굿 좋아요.

  

 


private void OnReceive(object sender, SocketAsyncEventArgs e)
        {


            try
            {
                if (e.BytesTransferred <=0) //0보다 같거나 작으면 소켓 종료로 처리한다.**** 주의 *****
                {
                    this.Dispatcher.BeginInvoke((ReceiveCallback)delegate
                    {
                        txtContent.Text += "\r\n" + "소켓이 종료되었습니다.";
                        sv.ScrollToVerticalOffset(txtContent.ActualHeight);
                        MessageBox.Show("서버와 통신이 종료되었습니다.");
                    }, null);
                    return;
                }

반응형