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
[37949] Re:Re:Re:indy에서 Connection Error처리???
왕대박 [emrwo] 1508 읽음    2004-11-08 20:32
왕대박 님이 쓰신 글 :
: 이채호 님이 쓰신 글 :
: : 죄송하게도 제가 사용을 ICS위주로 하다 보니 정확한 답변을 못 드립니다만 문제는 아시는대로 연결 문제입니다.
: :
: : 즉 상호 연결 체크 부분을 체크하시면 될겁니다.
: :
: : 만약 빠져있다면 추가하셔야합니다.
: :
: : 속성중에 prepared라는 부분이 있을것 같은데 체크해보시길~
:
: 우선, 답신을 주셔서 감사합니다.
: indy에서 prepared속성이 어떤걸 말씀하시는지 잘모르겠습니다. ???
:
: ///////////////////
: 그냥.. 제 생각에는
: 요~~ 메시지는 client연결상태가 임의적으로~ 강제적으로 바뀐것을 서버단에서 알아채지 못한체로~
: TCP/IP가 ack신호를 기다리다가 기다리다가~ 지쳐서 내보내는 메시지 인것 같은데...--;;;
: 즉, indy TCP Server에서  FD_*** 계열의 메시지를 서브클래싱해서 
: 해당 메시지를  모른체~ 해버리면 될 것 같은데... T.T;;;
:
: indy의  TCP Server 컨포턴트가 winproc 도 없고~ 그렇다고, handle도 없고~
: 해서~ Winproc을 오버~~ 할수도, SetWindowLong함수를 사용할 수도 없는 상태입니다.
: 그렇다면 이것도 답이 아닌가????
:
: 음... 님께서 말씀하신 방법이 어떤 것인지 조금만 더 자세히 알려주시면 어떨까요??
: 부탁드립니다.  아~~ 오늘까지 끝내야하는데.. 이제 오금이 저려옵니다. 그려...

에러나는 부분이 수신대기열이더군요.
여기에 예외처리를 붙이고~
Client Connection Thread를 날려버렸더니.. 해결되었습니다.

제가 생각한 바를 조금 더 설명을 하자면~
indy가 거의 완전하게 소켓을 뒤집어싸가지는 구조를 가지고 있기때문에
내부까지의 접근은 어렵고~ 재정의 또한 이래저래 어렵습니다.
아시는 분은 다 아시다 싶이 논리적으로 접속지향성의 TCP/IP의 구조적인 문제로 인해
Client가 물리적으로 연결이 끊어져버린 경우~
알아낼 방법은 주기적으로 패킷을 주고/받을 수 밖에 없습니다. 
이미 물리적으로 끊긴 connection에 논리적으로 작업을 걸어야 에러가 날 수 밖에...
이러한 둘 사이의 차이점을 똑똑한 윈도우가 알아채고는 메시지를 보내줍니다.
이 메시지를 받기위해 indy에서 발생하는 메시지를 가로체려고 했어나,
내공이 딸려서인지 할 수 없었고... (실제로 FD_**** 류의 메시지가
어차피~ "꽝"인 내용인지라~  쓰레드를 통해서 데이터를 기다리는 대기열 파트에 에러처리를 씌워서~
논리적인 connection을 날려버리면 어떨까하고 했더니 되었습니다.
제가 상상한 방법이 정확한지는 저도 모릅니다. --;;;
이렇게 했더니.. 되긴 되더군요...

답변주신 님 감사합니다. 꾸벅~~
void __fastcall TfrmMain::TCPServerExecute(TIdPeerThread *AThread)
{
    String          CMD;
    String          RevMsg;
    int             nlsID;
    FCommModule*    m_pRev;
    try {
        Application->ProcessMessages();
        RevMsg = AThread->Connection->ReadLn();
        m_pRev = (FCommModule*)AThread->Data;
    }
//    catch(EIdSocketError& e) {
    catch(...) {
        AThread->Connection->Disconnect();
        m_pRev = (FCommModule*)AThread->Data;
        TList*  pList = m_lstComModuel->LockList();
        try {
            pList->Remove( m_pRev ) ;
        }
        __finally {
            m_lstComModuel->UnlockList();
        }

        m_pRev->Free();
        AThread->Data   = NULL;

//        #ifdef _DEBUG
//        Memo1->Lines->Add( e.LastError );
//        #endif
        return;
    }

    m_pRev = (FCommModule*)AThread->Data;

    if(RevMsg.Length() <= 0 )   return;             //empty data
   Application->ProcessMessages();
  .............이하 생략 ................

}

+ -

관련 글 리스트
37932 indy에서 Connection Error처리??? 왕대박 1555 2004/11/08
37940     Re:indy에서 Connection Error처리??? 이채호 1336 2004/11/08
37944         Re:Re:indy에서 Connection Error처리??? 왕대박 1312 2004/11/08
37949             Re:Re:Re:indy에서 Connection Error처리??? 왕대박 1508 2004/11/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.