|
CientSocket, ServerSocket에서 소켓을 다루는 방법과
Indy에서 소켓을 다루는 방법은 다릅니다.
IdTCPServer에서는 OnExecute에서 Client의 요구를 처리하지요.
OnExecute(thread임) 에서 Read종류의 function을 불렀을 때 blocking되고
클라이언트쪽에서 비정상적인 종료를 했을 경우
Read관련 function이 signal되면서 예외를 발생시키거나 Read.. functon의 return이 0가 됩니다.
이 경우 thread의 실행을 나가면 됩니다.
자세한 것은 indy의 예제를 살펴 보시기 바랍니다.
뽀록이 님이 쓰신 글 :
: : 안녕하세요! Magic.홍지곤 입니다.
: :
: : 일단 서버는 UPS가 있고, 서버는 다운되지 않는다고 가정 합니다.
: :
: : 저도 서버쪽은 해결해야 됩니다.. 나중에 알게되면 저도 갈켜주세요!^^*
: :
: : 클라이언트 하나가 비정상적인 종료가 된다고 하더라도 제 생각에는
: :
: : 나머지 클라이언트 들은 정상적으로 돌아간다고 생각이 듭니다.
: :
: : 그리고 서버에서는 에러가 발생되지 않는게 정상이라고 생각합니다.
: :
: : 일단 클라이언트 한개가 비정상적인 종료가 됐다고 가정합니다.
: : (정전, 인터넷 라인 단절)
: :
: : 이렇게 됐을시 저는 이렇게 처리 했습니다. 서버쪽에서는
: :
: : 비정상적으로 종료된 아이디(IP), 쓰레드나 기타정보를 가지고 있는데요,
: :
: : 이거를 일정시간동안 아무런 응답이 없으면 서버에서 삭제시켜 버립니다.
: :
: : 그러면 다음에 다시 접속하더라도 들어 갑니다.
: :
: :
: :
: : 그리고 제생각에는 클로즈 할때 에러가 나는 것은 클라이언트에서 남아있는
: :
: : 쓰레들때문인 것 같은데요, 이건 쓰레들을 강제적으로 클라이언트에서 삭제한
: :
: : 후 클로즈 시키면 될 듯 싶습니다. 이부분은 해보진 않았습니다.
: :
: : 암튼 도움이 되었으면 좋겠습니다.
: :
: : 차근차근 한번 해보세요^^*
: :
: : 그럼! 즐거운 주말 되세요~~~
:
: : //-------------------------------------------------------------------------------------------
: 안녕하세요?
: 지곤님의 글 잘 읽었습니다.
:
: Indy는 아직까지 감이 안오는군요 ㅡ.ㅡ;;
: (물론 소켓을 잘 쓰시는 분은 특별히 어려울것은 없겠습니다만...ㅡ.ㅡ;;)
:
: 서버측에서 각 클라이언트들의 정보를 어느 메소드에 가지고 있나요?
:
: 그리고 서버에서 삭제를 시킨다고 하셨는데..삭제 시키는 방법에는 어떤 방법이 있는지
: 귀찮으시겠지만 가르쳐 주셨으면 하네요.. ^^;;;
:
: 마지막으로..
: 하나의 클라이언트가 비정상적인 종료를 했을때 나타나는 현상은....
: 연결되어 있는 모든 클라이언트끼리 패킷을 주고 받을 수 없게 됩니다.
: 에러메시지는 위에서 적었듯이 10054일겁니다 (확실한건 아닙니다 ^^)
:
: 또...새로운 클라이언트가 접속을 시도하면 10061에러 메시지가 뜹니다.
:
: 엄청 헤메고 있는데 ㅡ.ㅡ;;;
: 그렇다고 Indy를 포기할 수도 없겠고..
:
: 아무튼 여러 고수님들의 가르침을 부탁드립니다.
|