|
안녕하세요 블루입니다.
일단 TServerSocket을 쓰다가 문제가 생겼다고 하셨는데, 어떤쪽 스레드 문제인지 궁금합니다.
일단 소켓 프로그래밍을 할 경우 알아야할 필수적인 두가지가 있는데, 전송방식에 따른 차이입니다.
동기 방식의 전송과 비동기 방식의 전송으로 나눌 수 있는데 TServerSocket의 경우는 비동기를 기본으로
지원하고, 동기방식 역시 지원합니다. 제가 서버를 만들 경우가 있어서 TServerSocket을 사용한적이 있었
는데, 크게 문제는 없었던 것으로 기억됩니다. 참고로 필드테스트가 된 내용입니다.
그리고 인디의 경우는 동기 소켓을 기본을 하는 컴퍼넌트인데, 내부적으로 보면 1개의 커넥션마다 1개의
스레드를 생성하는 방식으로 되어있습니다. 그렇기 때문에 최대로 연결할 수 있는 갯수는 당연히 윈도우
시스템에서 제한하는 스레드 2000개 정도의 최대 접속량을 받을 수 있고, 비동기로 짠다고 해도 그 접속량
을 넘을 수는 없습니다.
서론이 길었고, 간단하게 설명을 드리자면, 인디에서 제공하는 TCP Server 컴퍼넌트는 동기소켓을 제작
되었는데, 내부 구조를 보면 소켓 접속 허용 이벤트를 while 루프로 돌리고 그것에 해당될때 마다 작업
스레드를 생성하고 그것에 커넥션을 맡기는 스타일입니다. 그렇기 때문에 루프가 돌때는 스레드에서 돌
리게 되겠고, TCP Server에 있는 OnExecute의 경우는 그 Accept후의 모든 작업의 Thread가 되는셈입니다.
이 스레드는 제가 알기로는 컴퍼넌트가 Destroy될때 자동으로 죽는것을 알고 있습니다. 그리고 아래 스레드
컴퍼넌트라고 표현 하신것은 스레드 컴퍼넌트가 아니라, 스레드를 관리해 주는 스레드 매니져 컴퍼넌트입니
다. 그게 있으나 없으나 큰 차이는 없겠지만, (저도 사실은 아직까지 안써봤습니다.) 여하튼 쓰면 좋은것 같
습니다.
인디의 에러는 거의 대부분 질문하시는것이 클라이언트가 Disconnect될때, Close Gracefully 라는 예외가
뜨는데, 그것은 에러가 아니라 클라이언트가 정상적으로 떨어졌다는 일종의 메세지라고 보시면 됩니다.
그외의 에러는 일종의 소켓예외로 MSDN쪽에 소켓예외 메세지쪽을 보시면 이 이유를 아실수 있을것이라고
생각됩니다. 일단 뭐 그렇게 제대로 설명을 드리지는 못했지만, 소스를 발취해서 보여주신다면 더 정밀한(?)
설명을 할 수 있을것 같군요..
그럼 도움이 되셨길..
그럼 이만
호좁이 님이 쓰신 글 :
: TServerSocket을 쓰다가 쓰레드 문제가 발생해서... 인디에는 자동(?)으로 해결이 된다구 들어서
: 인디를 쓰게 되었습니다.
:
: 인디를 깔고 예제를 보니(채팅예제가 있더라구요)
: 쓰레드 컴포넌트(?)를 프로퍼티에 넣어주면 그걸로 끝나는것 같더라구요
:
: 그래서 그 예제대로 OnExecute에 코딩을 해 놓았는데
:
: 그걸 서버사이드에서 돌려보니 엉망이더군요 ㅠ.ㅠ
: 첨에는 잘 되다가 나중에는 에러가 많이 나더군요.
: 그러다가 심지어는 서버의 소켓이 Disconnect되어 버리더군요
:
: 아무튼 문제가 많더라구요.
:
: 그래서 제가 곰곰히 생각을 해보았는데..
:
: OnExecute가 쓰레드로 작동하는것 같던데 그 쓰레드를 죽이는 루틴은 안보이는것 같더라구요
: 혹시 자동으로 소멸이 되는지 궁금하구요
:
: 만일 자동으로 소멸이 안된다면 어떤식으로 소멸을 시켜야 하는지도 궁금하네요
:
: OnExecute부분의 코딩은 예제의 그것과 대동소이 하거든요
:
: 고견 기다리겠습니다.
|