Q&A

  • TIdTcpServer.active := false 에 관해서 질문입니다.
안녕하세요 델파이를 이제 막 시작한 초보 델피언입니다..
델피언이라고 하기에도 챙피한 수준이지만... --;

다름이 아니라 인디컴퍼넌트를 이용해서
소켓통신 플그램을 하나 만들고 있는데요.

클라이언트의 연결이 없을 때 서버소켓을 죽이는건 잘 되는데
클라이언트가 연결이 되어 있을 때
서버소켓의 active := false;  로 줬을 경우
EIdClosedSocket 과 EIdTerminateThreadTimeout  이 발생하네요.

이 예외가 발생하는것이 정상인가요?

try
  serverSock.Active := false; // 여기서 위의 예외가 발생해서
  blRunningServer := serverSock.Active;
  updateControl;
exceptioin
  //여기서 serverSock.Active 값을 보면 여전히 true 로 나옵니다.
  blRunningServer := serverSock.Active;
  updateControl;
end;

저렇게 종료시켰다가 다시 리스닝을 시키면 리스닝이 되지 않습니다.
쓰레드뷰어로 보니까 처음 서버프로그램 실행시켰을때
7개의 쓰레드가 생성되었다가 리스닝이 시작되면 3개의 쓰레드가 더 뜨고
클라이언트 연결시 1개의 쓰레드가 추가로 또 생성됩니다.

클라이언트가 연결된 상태에서 active:=false; 를 주면
EIdClosedSocket 예외가 발생하고
몇초동안 아무작업을 안하다가 EIdTerminateThreadTimeout 이 발생합니다.
그리고 추가로 생성되었던 4개의 쓰레드는 사라집니다.

그런데 다시 active:= true; 로 주면 생성되어야 할 3개의 쓰레드가
생성이 안되는군요.. 아마도 서버소켓의 active 가 아직 true 의 상태여서
그런게 아닐까 생각해보는데요..생성되어야 할게 안됬으니
리스닝을 못하는건 당연하지요.죽였다 살리는 작업을 한번 더 하면
그때부턴 다시 리스닝이 됩니다.

그리고 netstat -na 로 보니까 예외가 발생하면서 종료되었던
연결은 Time_wait 상태로 계속 나오네요.
정상적으로 클라이언트에서 연결단절 시킨건 사라지는데
서버를 강제로 active:=false; 했을 경우에는 time_wait 상태로 계속 있습니다.

위에 발생하는 저 예외가 정상적으로 나오는 건지 아니면
제가 뭔가 중요한 실수를 해서 나오는건지 알 수가 없어서
이렇게 글을 올립니다.

그리고 인디소켓이 내부적으로 쓰레드를 사용하는거 같은데
소켓을 종료한다거나 할 때 별도의 쓰레드 해제 작업같은건
안해도 되는지요.예를 들어 클라이언트 접속 종료시
onDisconnect 이벤트에서 AThread.Terminate; 를 해줘야 한다던지....

저 위의 상황 말고도 인디소켓을 이용할 경우 자칫 지나칠 수 있는
중요한 사항이 있으면 덧붙여서 설명해주시면 너무너무 감사하겠습니다.

그럼 복들 많이 받으세요~~
1  COMMENTS
  • Profile
    KDDG_BaSTaD 2003.04.01 00:32
    >안녕하세요 델파이를 이제 막 시작한 초보 델피언입니다..
    >델피언이라고 하기에도 챙피한 수준이지만... --;
    >
    >다름이 아니라 인디컴퍼넌트를 이용해서
    >소켓통신 플그램을 하나 만들고 있는데요.
    >
    >클라이언트의 연결이 없을 때 서버소켓을 죽이는건 잘 되는데
    >클라이언트가 연결이 되어 있을 때
    >서버소켓의 active := false;  로 줬을 경우
    >EIdClosedSocket 과 EIdTerminateThreadTimeout  이 발생하네요.
    >
    >이 예외가 발생하는것이 정상인가요?
    >
    ==> 정상적인 예외입니다... Indy는 에러 메카니즘을 Exception을 사용합니다.


    >try
    >  serverSock.Active := false; // 여기서 위의 예외가 발생해서
    >  blRunningServer := serverSock.Active;
    >  updateControl;
    >exceptioin
    >  //여기서 serverSock.Active 값을 보면 여전히 true 로 나옵니다.
    >  blRunningServer := serverSock.Active;
    >  updateControl;
    >end;
    >
    >저렇게 종료시켰다가 다시 리스닝을 시키면 리스닝이 되지 않습니다.
    >쓰레드뷰어로 보니까 처음 서버프로그램 실행시켰을때
    >7개의 쓰레드가 생성되었다가 리스닝이 시작되면 3개의 쓰레드가 더 뜨고
    >클라이언트 연결시 1개의 쓰레드가 추가로 또 생성됩니다.
    >
    >클라이언트가 연결된 상태에서 active:=false; 를 주면
    >EIdClosedSocket 예외가 발생하고
    >몇초동안 아무작업을 안하다가 EIdTerminateThreadTimeout 이 발생합니다.
    >그리고 추가로 생성되었던 4개의 쓰레드는 사라집니다.
    >
    >그런데 다시 active:= true; 로 주면 생성되어야 할 3개의 쓰레드가
    >생성이 안되는군요.. 아마도 서버소켓의 active 가 아직 true 의 상태여서
    >그런게 아닐까 생각해보는데요..생성되어야 할게 안됬으니
    >리스닝을 못하는건 당연하지요.죽였다 살리는 작업을 한번 더 하면
    >그때부턴 다시 리스닝이 됩니다.
    >

    ==> 맞습니다. 한번 False로 셋팅하시면, 기존의 연결들을 해제하면서 EIdClosedSocket Exception이 발생하고요, ThreadPool에서 Listening Thread를 죽이면서 설정된 TimeOut(기본 5초)을 기다렸다가 아무 응답이 없으면 EIdTerminateThreadTimeOut을 발생합니다.

    Exception과 Error를 착각하시면 않됩니다. Exception이 곧 Error가 아니구요.. Exception중에서 Error가 있을 수 있습니다.. Error가 더 큰범위이지요.. Indy도 보면, Connection Closed Gracefully 를 사용합니다. 종료할때의 Exception이지요.. 클라이언트가 서버에서 disconnect할 때는 두가지 방식이 있습니다. Mutual Agreement와 Single Disconnect이죠.. 요 링크로 가셔서 읽어 보세요. Indy의 Author가 적은 기사입니다.

    >그리고 netstat -na 로 보니까 예외가 발생하면서 종료되었던
    >연결은 Time_wait 상태로 계속 나오네요.
    >정상적으로 클라이언트에서 연결단절 시킨건 사라지는데
    >서버를 강제로 active:=false; 했을 경우에는 time_wait 상태로 계속 있습니다.
    >
    >위에 발생하는 저 예외가 정상적으로 나오는 건지 아니면
    >제가 뭔가 중요한 실수를 해서 나오는건지 알 수가 없어서
    >이렇게 글을 올립니다.
    >

    ==> 실수가 아닙니다. 정상적으로 발생하는 예외입니다.


    >그리고 인디소켓이 내부적으로 쓰레드를 사용하는거 같은데
    >소켓을 종료한다거나 할 때 별도의 쓰레드 해제 작업같은건
    >안해도 되는지요.예를 들어 클라이언트 접속 종료시
    >onDisconnect 이벤트에서 AThread.Terminate; 를 해줘야 한다던지....
    >

    ==> 그렇지 않습니다. 쓰레드는 전적으로 서버콤포넌트에서 알아서 해줍니다.


    >저 위의 상황 말고도 인디소켓을 이용할 경우 자칫 지나칠 수 있는
    >중요한 사항이 있으면 덧붙여서 설명해주시면 너무너무 감사하겠습니다.
    >
    >그럼 복들 많이 받으세요~~
    • 강동균
    • 2003.04.01 22:01
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 강동균
      2003.04.02 03:33
      이권순[허준]님께서 델코에 올리신 답이었습니다. 작업중에 갑자기 ToolTip이나 디버깅시 값이 안보이...
    • 황영신
    • 2003.04.01 21:26
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신연근
      2003.04.03 20:45
      콤포넌트 관련해서 AcroEdit를 만드신 김성동님의 홈페이지에 콤포넌트 만들기 강좌있습니다. 참고하시...
    • 안기연
    • 2003.04.01 20:26
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박상윤
      2003.04.01 23:48
      프리뷰가 오버레이를 말씀하시는것인지... 체널 설정두 가능해야 하나요... 그럼 ..그정도 기능을 컴포...
    • 안기연
      2003.04.02 01:34
      답변해 주셔서 감사합니다. 질문 전에 dspack에 예제가 있어 Test를 해 봤는데 overlay(preview)가...
    • 거리
      2003.04.05 02:03
      TVCard를 사용하신다구요? 참 신기하게 지금 제가 하는일과 일치하네요..ㅋㅋㅋ 모드가 두가지가 있더...
    • 아폴론
    • 2003.04.01 19:38
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정종필
      2003.04.03 01:36
      델파이 인스톨 하시면.. scktsrvr.dpr 을 찾아서 그걸 열어 보세요.. scktsrvr.exe 가 하는게 궁금하시다...
    • 델사랑
      2003.04.03 09:10
    • 문의득
    • 2003.04.01 18:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신현숙
      2003.04.01 19:15
      안녕하세요..얼마전에 xp에서 com으로 출력때리다가 속도땜시 2~3달 고생한 적이 있어 글을 적습니다. LP...
    • 신석기
    • 2003.04.01 07:08
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 한영관
      2003.04.02 20:53
      Random 을 쓰세요... var   n, i : integer; begin   ListBox1.clear;  &...
    • 최용일
      2003.04.01 18:39
      안녕하세요. 최용일입니다. 11개 중에서 중복없이 5개를 뽑는 순열이네요... 11P5 수학책을 찾아보...
    • 김영대
      2003.04.01 09:39
      // 안녕하세요  김영대(http://www.howto.pe.kr) 입니다   // 그냥 예제를 찾아 실행...
    • 김희곤
    • 2003.04.01 06:01
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      2003.04.01 09:33
      // 안녕하세요  김영대(http://www.howto.pe.kr) 입니다   ShellExecute(Handle,'o...
    • shyuna
    • 2003.04.01 05:42
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      2003.04.01 05:45
      // 안녕하세요  김영대(http://www.howto.pe.kr) 입니다 // Delphi 에는 TParser 가 있습니다 ...
    • shyuna
      2003.04.02 20:16
      TParser를 사용할 경우.. 한글은 인식 못하는 거 같은데.. 다른 방법이 없을까요..;ㅁ;
    • 김영대
      2003.04.03 21:30
      // 안녕하세요  김영대(http://www.howto.pe.kr) 입니다 // 정말로 그렇네요... // TParser는 ...
    • nilriri™
      2003.04.01 18:41
      frmFind := TfrmFind.Create(application); 을 frmFind := TfrmFind.Create(nil); 혹은 frmFind := TfrmF...
    • ▦마당쇠(오정민)
      2003.04.01 19:35
      우선답변 감사 드립니다. 님께서 해보라고 하신데로 해보아도 결과는 마찬가지 입니다. 무엇때문에 그러...
    • 이용훈
    • 2003.04.01 02:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.04.01 03:31
      안녕하세요. 최용일입니다. 클릭했을때 뜨는 컴포넌트 에디터폼은 그냥 델파이 폼으로 만드시구요. 컴포...
    • 서정길
    • 2003.03.31 23:28
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      2003.04.01 05:58
      // 안녕하세요  김영대(http://www.howto.pe.kr) 입니다   Windows Socket API 말...
    • 서정길
      2003.04.01 19:01
      고맙습니다 김영대님 서점에 가서 찾아봐야겠네요... 영...맨땅에 헤딩하다가 지푸라기 잡은 심정이...
    • 최용일
      2003.04.01 01:04
      안녕하세요. 최용일입니다. 뭐 관리야 하는 사람 맘이겠지만... 저는 Source와 Binary를 따로 관리합니...
    • 정혜진
      2003.04.01 02:52
      역시 Library Path에 소수만 넣어 두는게 좋을거 같네요. 도움에 감사 드립니다.
    • 이수환
    • 2003.03.31 21:41
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.04.01 02:51
      안녕하세요. 최용일입니다. 제가 간단히 테스트 해봤는데... 잘 되는데요... IdUDPServer.Active가 T...
    • 이수환
      2003.04.01 03:54
      이상하게 저는 안되네요  ㅜㅜ 델6에 있는 Indy로 해봤구요 델파이 폴더의 ....DemoIndy 에 있...
    • 최용일
      2003.04.01 05:15
      안녕하세요. 최용일입니다. Indy의 UDPClientServer프로그램가지고 똑같이 해봤는데... 잘 되는군요... ...
    • 김동민
    • 2003.03.31 21:36
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.04.01 01:09
      안녕하세요. 최용일입니다. 에러 내용만으로는 무엇이 문제인지 전혀 알길이 없네요... OpenDialog이...
    • 강동섭
    • 2003.03.31 21:01
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_BaSTaD
      2003.03.31 23:41
      ==> 제가 예전에 만들어놓은 Thread를 이용한 Mailer 예제를 자료실에 올렸습니다.. 참고하세요..
    • 김한영
    • 2003.03.31 11:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_BaSTaD
      2003.04.01 00:32
      >안녕하세요 델파이를 이제 막 시작한 초보 델피언입니다.. >델피언이라고 하기에도 챙피한 수준이지만......