Q&A

  • 인디를 통한 client 접속시 끊김현상
INDY 9.0 를 TCPClient & TCPServer구조로 만들어서 테스트 중인데요
클라이언트쪽에서 서버로 접속하면 약 몇초후 끊겨버리구 재접속 클릭하면 접속이
안됩니다. ==> 서버프로그램을 죽인후 재시작하면 접속이 다시됩니다.=> 다시 동일 끊김 증상
끊긴후 client PC쪽에서는  해당서버에대한 IP, port 등의 TIME WAIT등을
전혀 가지고 있지 않지만(DOS에서 netstat 해보면),
서버 PC에서 netstat 해보면 클라이언트 정보(ex, 192.168.1.1:1004    TIME WAIT) 를 가지고 있습니다.

원인을 잡을수 없습니다. 도와주세요
서버쪽 프로그램의 문제인지, 스레드등의 문제인지....
혹시라도 아시는 분이 있다면 도움을 주시기 바랍니다.






2  COMMENTS
  • Profile
    심재용 2005.02.22 11:53
    서버쪽 tcpServerConnect 이벤트에 ReadTimeout 설정부분을 추가해 보십시오.

    procedure TForm1.tcpServerConnect(AThread: TIdPeerThread);
    begin

    AThread.Connection.ReadTimeout :=  5*60*1000;  <= 5분입니다. 값이 0 일때는 무한정입니다.

    ...

    end;

    동문서답일지도 모르겠지만, 아는 것만 말씀 드리겠습니다.

    일단 서버쪽 ReadTimeout 이 필요한 이유는 서버의 특성상 클라이언트의 요구사항에 정보를 제공해야 할 의무가 있습니다. 그런데 클라이언트가 접속하고 계속해서 어떠한 정보를 요구하지 않는다면 이유는 두가지입니다. 1.단선이 되었던지 아니면 2.클라이언트가 정보요청을 안했던지 2의경우는 문제될 것이 없으나 1의경우는 단선되었는데 서버쪽이 넉놓고 기다리기만 한다면 자원의 낭비가 되고 또 클라이언트 쪽에서 선로복구후 접속시도할 경우 이중접속의 가능성도 있기 때문에 이 문제점을 해결키 위해 ReadTimeout 이 꼭 필요합니다. 또다른 이유는 클라이언트쪽에서 자료전송중에 노이즈 발생하여 유효정보를 주지도 못하고 받지도 못하는 상황이 오랜동안 지속될 경우 강제적(기계적)으로 끈기 위함입니다.

    예제에서처럼 서버쪽에 5분이라는 ReadTimeout을 설정하고 클라이언트쪽에 타임컴포넌트를 이용하여 4분마다 어떤 메시지를 서버에 보내면 연결상태는 항상 유지됩니다.(클라이언트로 부터 메시지가 들어온 시간부터 다시 5분을 카운트 하기때문입니다). 또한 5분이 되서도 서버가 메시지를 받지 못한다면 그것은 단선이거나, 심한 노이즈, 클라이언트의 다운 등의 이유가 있는 것임으로 서버는 기계적으로 연결이 끈어집니다.






    >INDY 9.0 를 TCPClient & TCPServer구조로 만들어서 테스트 중인데요
    >클라이언트쪽에서 서버로 접속하면 약 몇초후 끊겨버리구 재접속 클릭하면 접속이
    >안됩니다. ==> 서버프로그램을 죽인후 재시작하면 접속이 다시됩니다.=> 다시 동일 끊김 증상
    >끊긴후 client PC쪽에서는  해당서버에대한 IP, port 등의 TIME WAIT등을
    >전혀 가지고 있지 않지만(DOS에서 netstat 해보면),
    >서버 PC에서 netstat 해보면 클라이언트 정보(ex, 192.168.1.1:1004    TIME WAIT) 를 가지고 있습니다.
    >
    >원인을 잡을수 없습니다. 도와주세요
    >서버쪽 프로그램의 문제인지, 스레드등의 문제인지....
    >혹시라도 아시는 분이 있다면 도움을 주시기 바랍니다.
    >
    >
    >
    >
    >
    >
    >
  • Profile
    이중철 2005.02.17 00:32
    이건 저도 좀 이해가 안가는데 일단은 조치할 수 있으니 몇자 적을께요

    일단 서버쪽 입니다.
    Execute 에 아무것도 없으면 서버는 자동으로 Client를 끊어 버리더군요
    단지 Sleep(1) 이거라도 적어보세요
    그리고 Client쪽 입니다.
    스레드 또는 타이머로 주기적으로 읽어보세요
    이것을 안하면 Client가 끊어 버리더군요
    그리고 스레드를 쓸때 OnException이 발생되면 스레드가 정지되고 끊어지니 확인하세요
    즉, OnException이 발생되는지 확인하세요
    (보통 메세지가 "우와하게 접속을 끊었습니다." 이렇게 나옵니다. ㅋㅋ 뭐가 우와한지ㅠㅠ)

    그리고 이 부문은 저도 이해가 안되는 부문이라서 뭐라고 말씀 못드리겠네요
    도대체 왜 이런부문을 꼭 추가해야 하는지 ㅠㅠ

    리플 안달려고 하다가 (해결책만 알뿐 원인은 몰라 솔직히 쪽팔려 답변 안 쓸려고 했는데 ㅠㅠ)
    이와 비슷한 건이 3개나 올라와서 리플 답니다.