Q&A

  • 소켓의 정체????
델파이에 있는 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월을 사무실에서 집에도 못가고 썩고 있습니다.
와이프가 보고 싶네여.......

  
2  COMMENTS
  • Profile
    ㉯㉰감자 2003.05.28 19:40
    1. 보통 ClientSocket에서 Connect하고 바로 데이터를 날려도 잘 되는 편인데
       님처럼 증상이 나오기도 하죠..
       그럼.. 꼭 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쪽 일하셨던 분이신가요?    


  • Profile
    타락천사 2003.05.28 18:12
    Visual C++ 의 AsyncSocket 과 비슷합니다.  
    둘다 윈속을 포팅해서 쓰는 거고요.

    제가 보기엔 소켓과 네트웍에 대해 좀더 공부를 해보시는게 좋습니다.

    즐푸하세여.

    타락천사.

    • yosule
      2003.05.30 11:24
      Table 컴포넌트의 프로퍼티 Exists를 사용하세요! property Exists: Boolean;
    • 김경남
    • 2003.05.28 20:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2003.06.09 02:50
      안녕하세여. 타락임다.. 트레이가 오에스를 가릴이유는 없습니다.. 아마 사용법에 실수가 있을 겁니...
    • KDDG_ZZOM
      2003.05.28 21:14
      이상하다... 전 아무이상없이 잘 되는데... 전 창민이가 올린것 보고 만들었는데... 자되고 있거든요.....
    • ㉯㉰감자
      2003.05.29 02:19
      BDE를 사용하는 방법도 있지만 이 방법은 BDE도 같이 배포를 해야 한다는 문제가 있습니다 ADO는 윈도...
    • 안기연
    • 2003.05.28 20:04
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박준철
    • 2003.05.28 19:54
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2003.06.09 03:05
      안녕하세여. 타락임다.. FTP 프로토콜은 기본적으로 TCP/IP보다 속도가 빠르고 안전성이 떨어집니다. ...
    • 혜월
      2003.05.29 01:41
      델마당 자료실에 버전관리 파일다운로드 프로그램이 있습니다 그걸 사용해 보세요
    • major
      2003.05.28 21:24
      안녕하세요... 정말 오랜만에 여기 사이트에 올라오네요... 흠흠... 서두가 좀 길군요...^^; 어...
    • 박준철
      2003.05.29 23:04
      타임아웃은 어느정도가 적당한 건가요 ?
    • 질문맨~
    • 2003.05.28 19:52
    • 2 COMMENTS
    • /
    • 0 LIKES
    • ㉯㉰감자
      2003.05.29 00:36
      저넘 사용하니깐 그런 증상이 나오던데... 결국 상용 tcp콘트롤로 해결한 경험은 있네요... 좀더 자...
    • 질문맨~
      2003.05.29 20:02
      Object에서 하는 일은 다른 서버에 설치되어 있는 데몬이랑 tcp통신을 통해서 데이타를 가져오는 역할을 ...
    • 엄태효
    • 2003.05.28 19:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • ㉯㉰감자
      2003.05.30 00:36
      델마당에 답변있다고 이야기 해도 되겠지만 한델만 이용하시는 님들이 계실것 같구... 질문 했는데 ...
    • 양승철
    • 2003.05.28 11:30
    • 2 COMMENTS
    • /
    • 0 LIKES
    • ㉯㉰감자
      2003.05.28 19:40
      1. 보통 ClientSocket에서 Connect하고 바로 데이터를 날려도 잘 되는 편인데    님처럼 증상이...
    • 타락천사
      2003.05.28 18:12
      Visual C++ 의 AsyncSocket 과 비슷합니다.   둘다 윈속을 포팅해서 쓰는 거고요. 제가 보기...
    • 이정은
    • 2003.05.28 10:40
    • 1 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2003.05.28 11:56
      샬롬~ 어떤 상황인지 모르겠지만..제가 보기엔 충분히 가능성있습니다. fieldCount도 구해지고.. ...
    • 오선배
      2003.05.28 18:24
      Sql 문장이 많이 틀렸내요 Top+cnt 는 왜 쓰는지  그렇게 쓰면 문장 자체가 Error dd1:= dd...
    • nilriri™
      2003.05.28 19:20
      샬롬~ Top 이라는건 MS_SQL에 있는겁니다. SELECT TOP 100 * FROM TB_ZIPCODE WHERE ZIP_SIDO LIKE...
    • 첨시작델
      2003.05.28 20:24
      ㄳ합니다..저에게 도움을 주어서여...^^그럼 옆에..[1]이라는거는 모를뜻하는건가여...혹시아시면 좀 알려...
    • 오선배
      2003.05.28 23:22
      Format(' Where A01_AAAAAA''%s'' ',['1']);    말그대로   이 A01_AAAAAA &...
    • nilriri™
      2003.05.28 12:00
      샬롬~ 앞뒤로 몇문장만 더 봤으면 좋으련만.. ㅡㅡ; 문장이 이해가 안가네요.. dd1:= dd1 + Forma...
    • 남경만
    • 2003.05.28 09:36
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박상기
      2003.05.28 10:23
      procedure TForm1.Button1Click(Sender: TObject); var   Button: TButton;  ...
    • nilriri™
      2003.05.28 11:53
      샬롬~ 멀티 셀렉트 인가하는 프로퍼티가 있습니다. 그거이용하면 컨트롤키와 쉬프트키 마우스를 이용해...
    • 조건일
      2003.05.28 06:43
      음... 잘 보면 아주 간단하게 보이는 문제네염...ㅋㅋㅋ 다음과 같이 보면 이해하기 쉬워집니다.. va...
    • 첨시작델
      2003.05.28 20:25
      ㄳ해여...답변을 주어서여...그럼 숫자2를 3을 써도 상관이 없겠네여.. 그럼 받는값을 2를 받고 3을 받는...
    • 이종택
    • 2003.05.28 06:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 미친코딩
      2003.05.28 18:20
      질문하신게 너무 광범위하네요. 그래도 조금 설명을 드리죠. 글로는 자세히 하기 정말 뭐하네요. dbe는 ...
    • 정수지
    • 2003.05.28 03:47
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2003.05.28 04:38
      SUM(F20) F20,... 이런식으로 알리아스를 줘보세요... 즐프하세요...
    • 장덕곤
      2003.05.28 09:14
      제가 알기로는 sum을 할때는 sum을 제일앞으로 빼야된다고 알고있어요 그리고 알리어스를 쓰구요 디비그...
    • 이광영
    • 2003.05.28 02:54
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 박정일
      2003.05.31 22:33
      Port가 기존의 시리얼인지 USB에서 변환된 가상Port인지를 구분하기는 힘들것같네요... 다만, 현재 PC에 ...
    • 이광영
      2003.06.02 19:51
      정말 고맙습니다.
    • 망내
    • 2003.05.28 02:18
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2003.05.28 02:42
      안녕하세요. 한원희입니다. OnChange 이벤트 핸들러를 구현하면 될것 같네요. procedure Edit1Change...
    • 박형근
    • 2003.05.28 02:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 오병주
      2003.05.28 05:42
      안녕하세요... 우선 퀵 레포트 버젼이 어떻게 되시나여 ? 정품주고 사셨나요 ? 아니면 델파이에서 제...
    • 또치
    • 2003.05.28 01:51
    • 5 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2003.05.28 12:06
      샬롬~ ㅡㅡ; 그럴리가?? 지금 컴에 델파이가 없어서 직접 테스트 해보진 못하겠지만.. 테이블하나...
    • 또치
      2003.05.28 22:48
      그러고보니, 정말 하나의 데이타소스를 썼으니깐 디비그리드에서 레코드가 바뀌면 룩업도 같이 바뀌는게 맞...
    • nilriri™
      2003.05.29 05:55
      샬롬... 데이터 소스의 데이터 체인지 이벤트에 코드를 작성해서 그랬네요.. procedure TForm1.DataSourc...
    • 또치
      2003.05.29 08:11
      아, 이렇게까지 자세히 설명해 주시다니 너무너무 감사해요. 움, 근데 저두 안되서리 이리저리 해보다가 ...
    • nilriri™
      2003.05.29 04:48
      샬롬~ 우선.. 많이 혼선을 드린거 같네요..ㅡㅡ; 지송스러버라.. 결론부터 말하자면..님과 같은 현상...