Q&A

  • 소켓에서 서버에 연결된 여러 클라이언트에 경고메세지 보내는 법은??

  서버가 갑자기 꺼지거나 강제 종료시 모든 클라이언트들에게 메세지를 보내고자 합니다.

  어떻게 하면 되나요?? 갈켜주세용~ ㅋㅋ

  참 갑자기 꺼지거나 하는건 어떻게 조건을 주면 되남유?? 전혀 감이 안와서..질문합니당..ㅋ
6  COMMENTS
  • Profile
    이정욱 2006.08.10 04:20
    서버 자체가 꺼졌을때는 당연히 불가능합니다.. 이미 하드웨어가 뻗었는데.. 무슨수로..

    단, 강제 종료시라고 함은 프로그램에 문제 없이 코딩이 되어있다면, OnClose나 OnDestroy 이벤트에서 처리해 주시면 됩니다.

    하지만 뻗어있는 상태를 강제 종료 시키는것이라면 불가능하지요..

    만약 서버가 여러대라면, 다른 서버가 전달을 해 줄수는 있습니다. 단, 클라이언트들이 한번에 두 서버에 접속해 놓고 있어야 겠지요.

    또 한가지는 클라이언트가 인터넷 공유기를 통하지 않고, 직접 공인IP를 통해 붙어있다면, 살아있는 서버가 그 IP목록에 접속하여 메세지를 보낼수도 있지만, 요새는 대부분이 방화벽 또는 공유기를 사용하기 때문에 현실적이지 못합니다.



  • Profile
    채팅 2006.08.08 23:39
    서버가 갑자기 꺼지는데 어떻게 서버에서 메세지를 보낼 수 있을 까요?
    죽은 놈이 살아나 보낼리도 없고요^^

    갑외에 별도로 다른 을 서버를 만들어서  클라이언트가 갑과 을에 동시에 연결하고 갑서버가 죽으면 을 서버가 클라이언트에 메세지를 보내면 될 것 같기도 한데..

    그렇지 않고 한개의 서버를 사용는 경우라면 비싼 UPS를 장착한 여유있는 서버사양과 안정적인 네트웍을 확보하여 그런 경우를 예방하는 것만이 해결책이 될 것 같군요.

  • Profile
    쉼표 2006.08.08 23:52
    예외처리나 에러처리를 통해서 충분히 메세지를 보낼수 있을것 같은데요...

    방법 좀 갈켜주세요...


  • Profile
    똘기콩쥬 2006.08.09 20:18
    제가 보기에는 님의 질문에 대해 답변자분의 의견이 거의 정답에 근접한거 같습니다.
    (에러루틴에 잡히거나 예외가 발생할 때,  
    해당부분에 처리루틴이 있다면 뭔가 될 수도 있겠지만요.
    에러처리던 예외발생이던 결국은 프로그램이 직접 수행하는 것인데
    해당 프로그램 자체가 이미 사망 혹은 기절했는데 비명소리가 들릴 리는 없겠지요.)

    전혀 감이 안오신다면서 답변자의 의견을 거부하고
    또다시,  충분히 될거라면서 다른 고수를 찾으시니까.
    답변자분 정말 불쌍해 보입니다.
    질의응답코너에서  답변자는 아무런 보답없이 아는 바를 전해 주는 고마운 분일텐데
    답변을 했다는 것 때문에 "전혀 감이 없는 분"보다 더 모르는 'No 고수"가  되셨네요.


    제 생각에는,
    님이 생각하시는 대로 직접 하시고 난 후에,  
    ( "예외처리나 에러처리를 통해서 충분히 메세지를 보낼수 있을것 같은데요...")
    그 방법을 설명해 주시는게 많은 도움이 될 거 같습니다.
    통신프로그램 개발자들 대부분(저도 당연히 포함)이 "님이 생각하시는 그 방법"을 배우고 싶어 할겁니다.
  • Profile
    쉼표 2006.08.09 21:40

    어라 제가 말한건 그런뜻이 아니었는데 그렇게 받아들여졌다니 죄송하네요~~

    저는 에러처리를 추가하려다가 그 부분이 막혀서 조건을 어떻게 주는지도 잘 모르겠고 해서

    질문은 한거고 웬만한 에러처리 같은건 다 된다고 알고 있어서( 정확하지는 않지만...)

    될꺼라 믿었는데 답변 주신분이 안된다는 식으로 말씀을 하시길래 다른 방법은 없나하고 물어본거에요

    제말이 잘못 전달되어 다시 한번 사과 드립니다..


  • Profile
    똘기콩쥬 2006.08.09 23:19
    ㅋㅋ 사이버공간의 특징이죠.. ^^

    일단 약간의 발상의 전환을 하셔서....

    하나의 서버가, 다수의 클라이언트를 관리하는 식  말고
    개별 클라이언트가 각자 알아서
    자신이 접속된 서버가 죽었는지 살았는지
    주기적으로 물어보는 식으로 접근해 보시는건 어떠신가요.
    주기적으로 서버에 더미 패킷을 던져서(Ping테스트 비슷)
    타임아웃될 동안 리플이 없으면 서버가 죽은 걸로 간주하는 식이죠.
    (보통은 이럴 경우 재접속시도도 하죠.)
    (증권 프로그램이나 모니터링 프로그램 등등 실시간 자료를 처리하는 프로그램들은 대부분 이런 기능 있음)
    물론,  제3의 모듈을 둬서 특정 서버의 Live 모드를 주기적으로 체크하는 방식도 많이 쓰는 걸로 압니다.
    (그래서, 이전 답변이 거의 정답일 듯 이라고 얘기했지요.)

    Blocking모드로 서버 하나가 N개의 클라이언트에 모두 메시지를 던지려면 시간 꽤나 걸리구요.
    당연하겠지만 서버가 클라이언트로 메시지를 던졌으면
    클라이언트가 리플해 주는거 기다렸다가 하나하나 마무리하는 것도 추가로 필요하겠죠.
    거기다가. 특정 클라이언트와 네트워크상에 장애가 발생하면
    그거는 또다시 시간이 제법 걸린 후라야 캐치되겠죠.(디폴트값이 60초쯤 될겁니다.)
    (서버는 특성상 어디선가는 Blocking모드로 복수개의 클라이언트를 관리하게 마련이죠...)

    기본 가정이.. 서버가 죽어가는 중인데..
    이런거 모두 할 여유가 있기는 어려울 겁니다.

    참고로, 사용하시는 통신 컴포넌트라든지, 혹은 개발하시려는 시스템이 어떤 종류라든지
    좀 더 구체적으로 설명하신 후에 질문하신다면
    아마도 같은 길을 지나가신 분들이 친절히 가이드해주겠죠?

    저 또한 지나가는 길이었으니까 또 들르도록 하겠습니다.