델파이에 있는 tserversocket 과 tclientsocket 을 사용하고 있습니다.
헌데 처음이라서 그런지 궁금한게 무지 많네여...
1. 클라이언트 소켓으로 데이터를 보낼 경우만 열고 보낸후 1~2초 후
닫으려고 합니다.
이 경우 열고 나서 바로 보내면 데이터가 전달이 되지 않더군요....
해서 타이머 interval을 1로 해서 돌리니 전달 되더라구요.. 허~~~
문제는 !!!! 서버와 연결이 되지 않을 경우 입니다.!!!!!!!!!!!!!!!!
클라이언트 소켓의 active를 true로 하고 보내면 에러가 나고
소켓이 완전 먹통이 되는 경우가 생기더라고요.......
해서 클라이언트 소켓의 connected를 확인하니 active := true한 후에
바로 연결이 되지 않더군요.....
connected = true 가 될때 까지 active를 true로하고 다시 확인하고
연결이 안되있으면 다시 true로 하고 를 while문으로 돌리니까
바로 에러가 나더군요..메모리가 어쩌고저쩌고...... 죽갔습니다.....~~~~
해서 중간의 약간의 for 루프를 돌리니 괞찬아 지더군요...
왜 그럴까여???
2. 이번엔 서버쪽입니다.
클라이언트가 접속을 하고 한참을 데이터를 주지 않습니다.
그러다 나중에 보면 각자 따로 놀더군요...
클라이언트가 pda입니다.
종료를 해도 서버쪽에서 disconneted이벤트가 발생하지 않더군요...
왜그럴까여???
데이터를 주기적으로 보내면 된다고 하는데....
pda가 전원절전 모드로 들어가면 그건 불가능하거든요...
계속 켜놓자니 밧데리가 얼마 못가고요....
서버 쪽에서는 연결을 끊는 부분이 전혀 없습니다.
솔직히 제가 어떻게 끊는지도 모르고 있습니다.
pda에서는 절전모드에서 살아나면 다시 서버로 데이터를 보내는데...
연결이 안되어 있어서 그러는지 한10초 정도 멈췄다 살았다 해서
거의 다운 상태고요....
소켓의 관해 아시는분 많은 조언 부탁드립니다.
이문제로 가정의달 5월을 사무실에서 집에도 못가고 썩고 있습니다.
와이프가 보고 싶네여.......
님처럼 증상이 나오기도 하죠..
그럼.. 꼭 Connect가 되었을때에만 전송하겠다고 하시면 다음과 같은 방법을 해보십시오...
1-1. TClientSocket.OnConnect이벤트에다.. Flag를 하나 세우세요
예) FConnect := True
1-2. TClientSocket.OnDisconnect이벤트에다 다시 Flag를 False로 잡으세요
예) FConnect := False;
1-3. TClientSocket.OnError이벤트에도 Flag를 False로 잡으세요
예) FConnect := False;
1-4. 이제 전송하는 루틴에서
FConnect = true일때 전송하시면 됩니다.
참고.. 한 Procedure나 Function에서 Connect~ Send~ Disconnect를
하실려면..님과 같이 Connect를 시도하고
그다음 Connected가 될때까지 while을 돌려도 되지만...
이때에는 반드시 Timeout체크 루틴을 넣으셔야 합니다
starttime = now
while not Connected do begin
endtime = now
if endtime-starttime > (?초) then // <= 이건 그냥 예이니 적절하게 쓰시고
break;
application.processmessage;
sleep(0);
end;
등등... 위 소스는 그냥 로직으만 보세요..
이렇게 while밖에서 다시 Connected를 검사해보시던지..아니면 while문에서 Flag를 세워서 Connected로 빠져 나왔는지 아니면 타임아웃으로 빠져나왔는지 검사하신다음 Send하시면 되겠죠
2. 서버쪽...
클라이언트에서 실지적으로 접속이 끊어졌는데도 불구하고 서버에서는
감지를 못할때... 이런경우에는 주로 PingPong메세지를 주고 받음으로서
처리를 하는 방법이 있습니다.
굳이 다른 방법을 찾겠다면 서버가 클라이언트에다 데이터를 Send해보는 방법도 있긴 있습니다... 찾아보면...아마 여러 방법이 나올거라 믿구요
제가 주로 쓰는 PingPong메세지에 대해서만 언급하겠습니다
클라이언트가 서버로 주기적으로 페킷을 전송합니다. (5초~5분...)
서버는 클라이언트로 받은 패킷을 그냥 바로 리턴해버립니다.
물론 패킷의 헤더부분을 손 봐도 되겠지요..
그러다...마지막으로 들어온 핑퐁 패킷의 타임과 현재시간을 비교하여
3번정도의 주고 받는 시간 정도가 넘어서면 끊어졌다 보고..
(5초 주기로 했다면 마지막으로 들어온 패킷시간과 현재시간 차가 15초 이상, 5분 주기였다면 15분 이상 차이나면..끊어졌다고 판단)
강제로 disconnect시켜버리는 거죠..
도움이 됬을런지 모르겠지만..
꼭 해결하셔서 가정으로 돌아가시기 바랍니다.
그런데 제가 아는 분과 이름이 똑 같네요..ㅎㅎ 혹시 부산에서 EDI쪽 일하셨던 분이신가요?