|
뭐 직접적인 해답은 아니지만..님의 질문이 이해가 잘 안됩니다.
클라이언트 1대가 9대의 서버에게 매번 1초에 한번씩 신호를 보내서
서버가 클라이언트에 접속을 요청해서 죽었는지 살았는지 체크한다..???
보통 서버 1대에 클라이언트 9대가 붙어서 이 9대가 죽었는지 살았는지를 서버가 체크해야되는게 맞는걸텐데요.
장성호님이 말씀하신것처럼 커넥션을 걸고있다가 연결이 끊기면 해당 pc가 죽은걸로 인식을 하든가..
매번 커넥션 거는것도 문제가 있는거 같구요.
회선 연결상태가 불안전하다면 갑자기 소켓연결이 끊어졌을때의 예외처리 같은 부분을 넣으셔야 안정적으로 체크가 될듯 싶습니다.
또한 각 커넥션도 쓰레드기 때문에 자원공유 충돌같은 문제.. 뭐 9대라고 해도 불가능하지는 않죠.
a라는 컴포넌트가 있는데 두개 혹은 세개의 커넥션이 들어와서 a를 함께 제어한다든지..메모리를 할당한다든지..
그러다 충돌나면 오류가...
보통 채팅 c/s 프로그램도 보면 예전에 텔넷환경에서는 고스트라고 그래서 분명 클라이언트는 접속이 끊어져있는데
채팅방에는 아이디가 여전히 남아있는 현상..등등..
사용자 접속이 많은 채팅 서버 같은 경우 다운이 되어도 1대의 대상 클라이언트가 다운되게 처리를 하지않으면
특정 문제에 따라서 서버가 다운될 경우 전체 클라이언트에 영향이 가는...
뭐 여러가지 문제가 있겠지만..제가 생각하는 코딩방향이랑 님이랑 약간 다른듯 싶습니다.
뭐 제가 해드릴 수 있는 조언이라면.. 안되면 한번 과감하게 알고리즘 자체를 바꿔 보시는것도..
-locke
궁금이 님이 쓰신 글 :
: 서버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분가량되면 에러가 뜨네요..
:
: 방법이 없을까요?
|