흔히 연결과 오류처리 부분은 따로 두는게 정상입니다만.
아무래도
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분가량되면 에러가 뜨네요..
: : : :
: : : : 방법이 없을까요?