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
[60033] Re:Re:Re:Re:Re:Re:1초 간격으로 Serversocket 연결확인 체크
오렌지 [davinm] 3464 읽음    2010-01-28 16:32
클라이언트 소켓의 경우 Error Event 발생시 Disconnect를 사용 하여서는 안되고
소켓의 Acvite 속성을 False로 설정 한 다음 Close 해야 하며,  서버와의 연결 상태 또한
Active 속성을 기준으로 사용 한다면 자동으로 서버와의 접속을 시도 할때 오류 없이
사용 할수가 있습니다.

void __fastcall TDataModuleComm::ClientSocketError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
       TClientSocket *SocketCur = static_cast<TClientSocket *>(Sender);

       if (ErrorCode == 10060)     ErrorCode = 0;
       if (ErrorCode == 10061)     ErrorCode = 0;
       if (ErrorCode == 10049)     ErrorCode = 0;
       if (ErrorCode == 10053)     ErrorCode = 0;

       //SocketCur->Socket->Disconnect(SocketCur->Socket->SocketHandle);
       SocketCur->Active = false;
       SocketCur->Socket->Close();
}



궁금이 님이 쓰신 글 :
: 링크 주소에 있듯 아래처럼 했드니
: void __fastcall TDataModuleComm::ClientSocketError(TObject *Sender,
:       TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
: {
:   TClientSocket *SocketCur = static_cast<TClientSocket *>(Sender);
:
:   if (ErrorCode == 10060)     ErrorCode = 0;
:   if (ErrorCode == 10061)     ErrorCode = 0;
:   if (ErrorCode == 10049)     ErrorCode = 0;
:   if (ErrorCode == 10053)     ErrorCode = 0;
:
:   SocketCur->Socket->Disconnect(SocketCur->Socket->SocketHandle);
: }
: 10038 에러가 또 막뜨네요... 닫힌 소켓을 또 닫아서 생기는 에러라던데,,, ㅠㅠ
:
: 둘리.CSIEDA 님이 쓰신 글 :
: : 흔히 연결과 오류처리 부분은 따로 두는게 정상입니다만.
: :
: : 아무래도
: :
: : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=35612
: :
: : 위의 포스팅과 관계가 있을듯 합니다.
: :
: : 서버가 살아 있는지 체크하는 것이 아니고 연결이 불가피하게 끊어졌을때 복구를 위해서 작성 하신듯 합니다.
: :
: : 이런경우 연결이 끊어지는 것을 이벤트로 받아서 그것만 처리하는 루틴을 따로 작성하시는것이
: :
: : 훨씬 윈칙 입니다만...
: :
: : 1초에 한번씩 10개의 소켓을 검사하는것은 그다지 경제적이지 않겠죠.
: :
: : 앞의 링크 내용을 살펴보시기 바랍니다.
: :
: :
: :
: : 장성호 님이 쓰신 글 :
: : : 음...
: : : 개인적으로 Network관련해서는 경험이 별루 없느데요
: : :
: : : 순전히 제 생각인데..
: : :
: : : 1초 간격으로 서버가 살아있는지 체크를 해야한다면?
: : :
: : : 서버에 1초 간격으로 접속을 반복하기 보다는...
: : :
: : : 한번접속하고
: : :
: : : 서버와  클라이언트간에 메세지를 주기적으로 주고받는것이 어떻겠습니까?
: : :
: : : 잘은 모르지만 요게 더 확실하고 부하도 덜 먹을것 같은데...
: : :
: : : 그냥 network에 대한 경험이 별루 없는 제 의견이니까 참고만 하세요
: : :
: : : 그럼..
: : :
: : :
: : :
: : : 궁금이 님이 쓰신 글 :
: : : : 말씀해 주신대로  PCCheckTimer->Enabled = false;  << 여기
: : : :                           PCCheckTimer->Enabled = true;  << 여기
: : : : 를 추가하였음에도 불구하고 다음과 같은 에러창은 여전합니다... ㅜㅜ 다만 에러창 겹쳐뜨는 속도가 약간 줄었습니다
: : : : 소켓이 연결되었는지 안되었는지 안되었으면 1초 간격으로 연결시도하는 루틴이 필요한데
: : : : 제가짠것처럼 하면 안되나봅니다 ㅜㅜ
: : : : 도와주세요 급해요~
: : : :
: : : :
: : : : 둘리.CSIEDA 님이 쓰신 글 :
: : : : : Timer 를 끄고 작업해보세요.
: : : : : 일반적으로 Timer 가 걸려 오면 다음 타이머가 오지 않습니다만, 꼭 그렇지가 않습니다.
: : : : : 가령 ClientSocketPC 의 어느것이 active = true 에 연결을 하였을때 연결 event 등 각종 상태를
: : : : : Status bar 에 출력하는  event 처리 부분이 있었고, 거기에 message 처리 부분이 있었다면
: : : : : timer 가 올 가능성이 있습니다.
: : : : :
: : : : : 이런 부분이 없는 상황에서 작성하여 잘돌다.. 후에 이런 부분을 추가할 경우 예상치 못한 오류가 날때가 있죠.
: : : : :
: : : : : 그래서 일반적으로 timer 가 오면 해당 timer 를 끄고 (꼭 시간을 정확하게 측정하여야 하는 경우 빼고는)
: : : : : timer 를 끄고 작업을 하는것이 일반적입니다.
: : : : :
: : : : : 코드 전부를 볼수 없어서 정확한 오류의 원인으로 단정할 수는 없습니다만..
: : : : :
: : : : : void __fastcall TDataModuleComm::PCCheckTimerTimer(TObject *Sender)
: : : : : {
: : : : :       PCCheckTimer->Enabled = false;  << 여기
: : : : :
: : : : :       for (int i = 0; i < 9t; ++i){
: : : : :       if (IPAdd[i]!="")  ClientSocketPC[i]->Host = IPAdd[i];
: : : : :       if (ClientSocketPC[i]->Host != "" && ClientSocketPC[i]->Socket->Connected == false)                                
: : : : :          ClientSocketPC[i]->Active = true;
: : : : :       }
: : : : :
: : : : :       PCCheckTimer->Enabled = true;  << 여기
: : : : :
: : : : : }
: : : : :
: : : : : 궁금이 님이 쓰신 글 :
: : : : : : 서버soket과 접속이 될때까지 계속 체크하는 프로그램을 짜고있습니다.
: : : : : :
: : : : : : 서버soket쪽과 연결이 안되면 계속 ClientSocketPC[i]->Active = true; 를 하고있는데 한 5분 쯤 지나면 에러가 파바바박 계속 뜨네요
: : : : : :
: : : : : : ClientSocket 으로 짠 프로그램에서 1초 간격으로
: : : : : :
: : : : : : 9개의 ServerSocket 으로 짠 프로그램이 있는 각각의 PC 에게 접속을 요청해서 그 IP에 컴이 살이 있는지 죽었는지를 체크하는
: : : : : :
: : : : : : 프로그램을 작업 중 입니다
: : : : : :
: : : : : : ClientSocket 으로 짠 프로그램에서  Timer 를 1초 간격을 주어
: : : : : : ===============================================================================================
: : : : : : for (int i = 0; i < PCCnt; ++i){
: : : : : :     ClientSocketPC[i] = static_cast<TClientSocket *>(FindComponent("ClientSocketPC" + IntToStr(i + 1)));
: : : : : : .
: : : : : : .
: : : : : : .
: : : : : : .
: : : : : : void __fastcall TDataModuleComm::PCCheckTimerTimer(TObject *Sender)
: : : : : : {
: : : : : :       for (int i = 0; i < 9t; ++i){
: : : : : :       if (IPAdd[i]!="")  ClientSocketPC[i]->Host = IPAdd[i];
: : : : : :       if (ClientSocketPC[i]->Host != "" && ClientSocketPC[i]->Socket->Connected == false)                                
: : : : : :          ClientSocketPC[i]->Active = true;
: : : : : :       }
: : : : : : }
: : : : : : ===============================================================================================
: : : : : :
: : : : : : 위와 같이 timer 를 사용하여 1초 간격으로 연결이 안된 컴퓨터에는 계속 ClientSocketPC[i]->Active = true;
: : : : : : 를 하였습니다.
: : : : : : 컴퓨터가 살아서 Connected  된곳은 문제가 없는데 serversocket과 연결이 안된 컴퓨터 때문에 프로그램 실행후
: : : : : : 5분가량되면 에러가 뜨네요..
: : : : : :
: : : : : : 방법이 없을까요?

+ -

관련 글 리스트
60026 1초 간격으로 Serversocket 연결확인 체크 궁금이 1545 2010/01/28
60032     Re:1초 간격으로 Serversocket 연결확인 체크 locke 1964 2010/01/28
60027     Re:1초 간격으로 Serversocket 연결확인 체크 둘리.CSIEDA 1412 2010/01/28
60028         Re:Re:1초 간격으로 Serversocket 연결확인 체크 궁금이 1618 2010/01/28
60029             Re:Re:Re:1초 간격으로 Serversocket 연결확인 체크 장성호 1546 2010/01/28
60030                 Re:Re:Re:Re:1초 간격으로 Serversocket 연결확인 체크 둘리.CSIEDA 1447 2010/01/28
60031                     Re:Re:Re:Re:Re:1초 간격으로 Serversocket 연결확인 체크 궁금이 1474 2010/01/28
60033                         Re:Re:Re:Re:Re:Re:1초 간격으로 Serversocket 연결확인 체크 오렌지 3464 2010/01/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.