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