C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[4505] Re:클라이언트에서 서버 접속시 에러(Errorcode =0 후에도 발생)
관리자 [administrator] 3674 읽음    2000-12-01 00:00
이호경 님이 쓰신 글 :
: 넘 수고하시는 군요!! 좋은 답변 많이 주워가고 있습니다. 언젠가는 지두 근사한 답을 담을 기회가 생기겠지요..^^헐~
:
: 각설하고,
: 클라이언트 소켓에서 서버쪽으로 접속을 시도하는데 서버의 소켓이 오픈되어있지 않을 경우에 발생하는 ESocketError는 클라이언트 소켓의 OnError 이벤트의 핸들러에서 ErrorCode를 0으로 세팅해주는 방식으로 무사히 해결을 했습니다.
: 전 실전에서 예기치 않은 사태로 서버 소켓이 닫히거나 하는 경우가 있으리라 생각되어서 클라이언트가 서버 접속에 실패하면 OnError 이벤트에서  ErrorCode를 0로 세팅하고 다시 재접속을 시도하게 구성을 해봤습니다. 그랬더니 처음 한참동안은 계속해서 재접속을 시도하더군요. 도중에 서버 소켓이 열리면 잘 붙기도 하구요..
: 그런데 서버소켓이 247번 째까지 열리지 않는 경우에는 이상한 에러메시지 창이 계속해서 생겨나더군요.(계속 생기는 이유는 계속 서버 접속을 시도하는 과정에서 생기는 것이겠죠)
: 더 이상한 건 서버 접속이 실패하는 도중에 성공한 접속이 있더라도 그 와는 상관없이 꼭 OnError 이벤트가 247번째 발생하는 시점에 에러창이 생성된다는 점입니다.
:
: 천개도 넘는 Q&A를 다 뒤져봤는데 원하는 답이 없더군요. 흑흑~~ㅠ.ㅠ
: 이럴땐 어캐 처리를 해줘야 하는지요??
:
: 고수님, 제발 좀 도와주세용~i



임펠리테리입니다.

이호경님의 경우에 확실히 적용되는지 장담은 못하겠습니다만(247번째까지 시도해본 적이 없어서요), 소켓의 OnError 이벤트에서 ErrorCode를 0으로 세팅하는 외에 의외로 잘 알려지지 않은 다른 에러처리 방법이 있습니다.

SetErrorProc() 함수는 소켓 에러처리 핸들러 함수를 설정해주는 역할을 합니다. 기본적으로는 에러처리 함수가 설정되어 있지 않아서 익셉션이 그대로 노출되는데, 에러처리 함수가 설정되면 익셉션이 뜨는 대신 설정된 에러처리 함수로 넘어갑니다. 그러므로 이 에러처리 함수를 껍데기만 있는 빈 함수만 만들어줘도 충분하지요.

방법은 간단합니다. 먼저 소켓을 포함한 폼 내에 다음과 같이 에러처리 함수를 선언합니다.
void __fastcall SocketErrorproc(int ErrorCode)
{
} // 껍데기만 있어도 충분합니다.

그런후, 소켓을 처음 오픈하기 전에 실행될 코드(폼의 크리에이트 이벤트나 폼 생성자 등)에 단순히 다음과 같이 한줄을 추가하면 됩니다.
SetErrorProc(SocketErrorproc);
여기서 인자로 넘겨지는 함수 이름은 위에서 만든 빈껍데기 함수의 이름과 일치해야 합니다.
이렇게만 하면 이후로는 소켓 익셉션이 뜨지 않게 됩니다.

그럼 참고하시길....

+ -

관련 글 리스트
4504 클라이언트에서 서버 접속시 에러(Errorcode =0 후에도 발생) 이호경 3229 2000/12/01
4505     Re:클라이언트에서 서버 접속시 에러(Errorcode =0 후에도 발생) 관리자 3674 2000/12/01
4512         >> 테스팅 결과 << 대충 다음과 같은 결과를 얻었슴다 (( 해석 좀!!)) 이호경 3168 2000/12/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.