Q&A

  • 소켓에러 ( 10053 ) 에 대해서 질문드립니다
안녕하세요

도저히 모르는게 있어서 질문드립니다

얼마전에 서버 프로그램을 하나 짰습니다

TServerSocket 을 사용했구여 클라이언트는 1 개만 접속하는 아주 간단한

구조입니다

클라이언트가 접속하면 DB 에 새로운 항목이 추가되었는지 체크해서

새로운 항목이 있을때만 클라이언트에게 문자열로 날려주는게

주된 Process 입니다

근데 한 30분정도 잘되다가 10053 번 에러가 뜹니다 -_-

클라이언트쪽에선 접속이 끊어지면 30 초 간격으로 재접속을

시도하도록 되어있는데 저 에러가 발생하면 30 분정도 있다가

접속이 되더군여

게시판 다 검색해보고 MSDN 도 뒤져보고 했는데

마땅한 답이 별로 없었습니다

제가 알아낸건

1. 데이터 전송중에 클라이언트의 접속이 갑자기 끊어져서 그렇다

2. 서버쪽에서 끊어버리는것이다

3. 소켓 큐에 남은 공간이 없어서 그렇다

이정도 밖에 못알아냈습니다

다른건 다 그렇다쳐도 왜 클라이언트쪽에서 재접속을 못하는걸까요

로그를 남겨서 살펴봤는데 끊어지고나서 정확이 30분이 지나야

재접속이 됩니다 ( 1분도 틀리지 않습니다 -_- )

클라이언트쪽이 문젠지 서버쪽이 문젠지 서로 다른 답을 하신 분들이

많아서 그것도 아직 확실히 못알아냈습니다

어느부분을 체크해봐야 할까요

지금 해놓은 조치라곤 에러에 상관없이 에러가 발생할때마다

서버소켓을 닫았다가 5초뒤에 다시 오픈하는정도입니다

머.. 물론 그래도 마찬가지지만여.. -_-;;

혹시 비슷한 경험을 해보신 분 계시면 힌트라도 좀 주셨으면 좋겠습니다

이거땜에 요즘 머리가 많이 아파서여..

항상 도움만 받아가는데 죄송스럽구여

다시 한번만 조언 부탁드리겠습니다

감사합니다





3  COMMENTS
  • Profile
    이현철 2002.06.28 20:31
    ErrorCode가 10053 인 경우가 바로 클라이언트가 비정상 종료가 발생되어서 생기는
    에러코드 입니다. 왜 클라이언트가 비정상 적으로 끊기는지는 모르겠지만..

    저도 비슷한 프로그램을 만든적이 있는데, 클라이언트에서는 약 10초마다
    서버에 접속을 요구합니다.(연결이 되어있다면.. 연결 타이머를 false 시킵니다)
    서버쪽에서, 클라이언트의 비정상 종료시에 해당 client 소켓을 close시키시나요?

    참고로, 제가 예전에 작성했던, 코드를 올립니다

    //------------------------------------------------------------//
    // Client 쪽  - 서버에 접속 시도
    //------------------------------------------------------------//
    procedure Tfrm_main.Login_TimerTimer(Sender: TObject);
    begin
      Login_Timer.Enabled := False;
      AttemptConnect;
    end;
    Procedure Tfrm_main.AttemptConnect;
    begin
      if ClientComm.ConnectionState = Connected then Exit;
      if ClientComm.ConnectionState = Closed    then Exit;

      ClientComm.Start(ServerIp, 9000, MyMacAddress); {서버에 접속 시도}
    end;


    //----------------------------------------------------------------------//
    // 서버 쪽 -  TServerComm - ServerSocket 이벤트
    //----------------------------------------------------------------------//
    Procedure TServerComm._OnAccept(Sender: TObject;Socket: TCustomWinSocket);
    begin
      Display_EVENT_MSG(Socket.RemoteAddress + ' ' + LoginMsg, 0);
    end;
    Procedure TServerComm._OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
      Display_EVENT_MSG(Socket.RemoteAddress + ' ' + LogoffMsg, 1);
    end;
    Procedure TServerComm._OnClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;  var ErrorCode: Integer);
    begin
      ErrorCode := 0;
      Socket.Close;
    end;
  • Profile
    김영철 2002.06.28 23:09
    먼저 답변감사드립니다 (__)

    올려주신 예제대로는 아니지만 에러가 발생하면

    ServerSocket1.sockett.active := false;

    이런식으로 소켓닫아주구요

    5초뒤에 다시

    ServerSocket1.socket.active := True;

    이런식으로 Open 하고 있습니다

    Socket.close 랑 같은 동작은 하는걸로 아는데 아닌가여?

    다시 한번 답변 감사드립니다. (__)

    참.. 그리고 클라이언트 프로세스를 죽였다가 살리면

    또 바로 접속이 되거든여.. 흠냐..

  • Profile
    이현철 2002.06.29 02:17
    Do it!

      [  Socket.close  ]
    • 김영철
    • 2002.06.28 07:55
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이현철
      2002.06.28 20:31
      ErrorCode가 10053 인 경우가 바로 클라이언트가 비정상 종료가 발생되어서 생기는 에러코드 입니다. 왜 ...
    • 김영철
      2002.06.28 23:09
      먼저 답변감사드립니다 (__) 올려주신 예제대로는 아니지만 에러가 발생하면 ServerSocket1.sockett....
    • 이현철
      2002.06.29 02:17
      Do it!   [  Socket.close  ]
    • 서종환
    • 2002.06.28 06:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2002.06.28 15:19
      안녕하세요 하얀까마귀 입니다. WM_Paint 메세지는 기본적으로 클라이언트 영역을 모두 무효화 시켜 버...
    • 최용일
      2002.06.28 07:54
      안녕하세요. 최용일입니다. 그냥 간단히 마우스로 선택해서 복사해가지고 붙이시면 됩니다.  ...
    • 델파이사랑
      2002.06.28 18:14
      감사합니다..정말 그러네여....~~
    • 오현주
    • 2002.06.28 05:07
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 성더기
      2002.06.28 22:05
      프라이머리 키를 신경 안쓰셔두 된다면 insert into () select 문을 이용해 보세요 ()안에 오는 필드갯수...
    • 박준열
      2002.06.28 09:40
      TQuery Comp의 Afterscroll Event를 이용하여 처리하면 가장 좋을듯한데, Insert Into를 사용하지 않고 Ta...
    • 박재현
    • 2002.06.28 04:42
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 진돌
    • 2002.06.28 04:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.06.28 07:58
      안녕하세요. 최용일입니다. 델파이에서 자동으로 생성하는 폼은 기본적으로 하나의 인스턴스만 실행됩니...
    • 미러
    • 2002.06.28 03:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 미러
      2002.06.28 21:47
      for I := 0 to Grid.ColCount-1 do for J := 0 to Grid.RowCount-1 do Grid.Cells[I, J] := ''; 이...
    • KDDG_ZZOM
      2002.06.28 03:34
      cells단위로 clear할려면  루프돌려서 해야되는거 아닌가??? 다른방법은 모르겠네요... &n...
    • 이추형
      2002.06.29 21:40
      어디서 부터 말씀을 드려야 할지 감이 않오네요. 몇년전까지만 해도 출퇴근 체크기가 오라클등등의 DB에 ...
    • 허지영
      2002.06.28 03:25
      Local 입력용인지.. 아니면 출근카드 사용하는건지 확실히 말씀해 주세여 ^^ *
    • 소니기빵
      2002.06.28 01:50
      안녕하세요. 이벤트에 보시면 exit 이벤트가 있어요. 거기서 코딩하시면..^^ 그럼..이만.
    • 송강식
      2002.06.28 02:54
      단순히 tcp/ip만을 이용해서 오라클에 접속하는 컴포넌트가 있습니다. 그럴 쓴다면 일은 훨씬 쉽지요.. 오...
    • 머슴
      2002.06.28 02:25
      클라이언트를 전부 깔필요는 없구요.. Sql*net만 설치하시면 됩니다...
    • KDDG_ZZOM
      2002.06.28 02:21
      잘은 모르지만... 클라이언트깔아야 편할것 같기도 하고요... sql net이 다른거 보다 빠르다는걸로 알고 ...
    • 이현철
      2002.06.28 02:19
      우선 client pc 에슨 oracle 드라이버가 없기 때문에 oracle client 를 먼저 설치하셔야 할겁니다...
    • jslove
    • 2002.06.28 01:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.06.28 01:35
      안녕하세요. 최용일입니다. 자료실에서 검색해보세요. 10여개 정도 있을겁니다. Torry나 DSP같은 사...
    • 최용일
      2002.06.28 01:05
      안녕하세요. 최용일입니다. RX라이브러리에 있는 패키지중 몇몇개는 런타임전용 패키지입니다. 설명서에...
    • 최수림
      2002.06.28 02:04
      감사합니다..!! 저의 불찰이었군요..^^
    • 백지연
    • 2002.06.28 00:13
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 강동순
      2002.06.28 01:53
      글세요 원하는 답이 델넌지 모르겠네요 그런데 저희회사 Print (크리스탈 레포트로 만듬)아주 잘됨 ...
    • 백지연
      2002.06.28 03:34
      답변 고맙습니다. 예제로 주신거는 쿼리 결과를 임시 테이블에 저장해서 사용하신것 같네요.. 그러면 ...
    • 정태현
      2002.06.28 00:21
      Subject      ADO를 이용하여 동적으로 odbc의 알리아스를 생성하는 방법 ...
    • (_^^)~U
    • 2002.06.27 23:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최장원
      2002.06.27 23:38
        ComboBox1.SetFocus;   ComboBox1.DroppedDown := TRUE; 일케 해보세염..그럼 ...
    • 하기
      2002.06.27 22:20
      한가지 방법이 있느데 참고하세요... 앞의 코드로만 Combobox를 찾아가는 방법은 Function으로 작업 하시...
    • 세미콜론
      2002.06.27 22:38
      감사합니다. 좋은 방법이네요... 좀 더 쉬운 방법을 찾고싶었는데.. 이런 방법도 있었네요... 감사드리...
    • 최장원
      2002.06.28 00:46
      콤보박스 첸인쥐 이벤트에 ComboBox1.ItemIndex := ComboBox1.Items.IndexOf (ComboBox1.Text); 넣...
    • 한재령
    • 2002.06.27 21:26
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이현철
      2002.06.28 02:16
      ado 쓰지 마시고, mysql 전용 접속 dll 을 스세요 저두 그거 쓰는데, 빠르고 간편하고 속도도 빠르고 좋아...
    • 델초보
    • 2002.06.27 20:45
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.06.27 21:18
        if tvEventList.Items.Count > 0 Then     label1.Caption:= inttost...