C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[40553] Re:[질문] 응답없음 (제발 꼭 봐주세요.)
evergreen [heredity] 1333 읽음    2005-06-14 17:04
heredity입니다. 질문하신 내용을 보고 몇 자 적습니다.

1. Socket API를 직접 사용하셨는데, TClientSocket, TServerSocket 또는 Indy를 사용해 보심이 어떨런지요.
   이 Comp.들은 상당히 잘 만들어져 있습니다.

2. NonBlocking mode를 사용하셨다는데, 님의 Source중 connect() 부분은 Blocking 모드인 것 같습니다.
   만약 Blocking 모드를 사용하셨다면 기기와 연결되지 않으면 당근 프로그래밍 멈춰 있겠죠!

3. void cSockUtil::read_sock() {
       :
     m_clksaved[i] = clock();           // 이 부분을 당근 넣으 셨겠죠 ?
       :
   }

4. Log에 대하여 추가로 말씀 드리면 Log를 남길때 메시지를 저장한 후 File을 닫으면 App.가 죽어도 Log는
   남아 있게 됩니다.  아래 간단한 Log 함수를 남기오니 참조하세요.

     #include <stdio.h>

     //---------------------------------------------------------------------------
     void __fastcall Log( AnsiString asMsg, bool bClear )
     {
       TDateTime  dt      = TDateTime::CurrentDateTime();
       AnsiString asFile  = dt.FormatString( "YYYYMMDD" ) + ".TXT";
       AnsiString asTime  = dt.FormatString( "HHNNSS" );
       PCHAR      pchFile = asFile.c_str();
       FILE       *pfp;

       if( bClear ) {
         if( FileExists( pchFile ) ) {
           DeleteFile( pchFile );
         }
       }

       pfp = fopen( pchFile, "a+" );

       if( pfp != NULL ) {
         fprintf( pfp, "%s\n", (asTime + "> " + asMsg).c_str() );
         fclose( pfp );
       }
     }

즐~


초보자 님이 쓰신 글 :
: 장비를 소켓통신 으로 감시해서  데이타 베이스에 저장하는 프로그램입니다.
:
: 프로그램을 시작하면 데이타베이스에서 IP와 PORT를 읽어와서 연결을 시도하고  연결된 장비의 데아타를 수신해서
: 처리를 합니다.
: 기본은 수신방식이지만  주기적으로(10분 간격) 폴링을 하고 다시 수신모드로 전환합니다.
:
: 그런데 처음 실행하면 잘 동작을 합니다.  데이타베이스에도 데이타 처리 결과가 잘 저장되구요.
: 그러다가 "응답없음"  상태가 되어서 전혀 데이타 처리를 하지 못하고 있습니다.
: 어떤때는 1시간만에 또 어떤때는 3일 정도 지나서 "응답없음"  상태가 되어 버립니다.
:
: 감시하는 장비의 갰수가 50개가 넘는데  몇개정도는 연결이 안됩니다. (랜 연결이나 장비의 점검등으로 케이블을 뺄 경우 있음.)
: 그래서 5분 간격으로 다시 연결을 시도 합니다.  이럴때 정상적이면 바로 연결이 되지만 연결이 안될때는 장비 1개당 약 20초가 걸립니다.
: 몇개 장비가 이럴경우 1분 이상 "응답없음"  상태가 되었다가 다시 실행을 합니다.
: 그리고 쓰레드를 책과 예제를 통해서 적용을 했습니다.
:
: "응답없음"  에 대해서 자료를 찾다보니 "메모리 관리",  "쓰레드의 데드락 상태",  "무한루프" , "block 상태"    등이 있더라구요.
: 그래서 배열변수등 일일히 소스를 찾아 봤습니다. 아직은 이상은 못찾았구요.  쓰레드도 혹시 몰라서 전에 사용하던
: 순차적으로 감시하는 방식으로 바꾸고  데이타의 송신과 수신 모두 select 함수를  사용해서 non block 방식으로 사용하고 있습니다.  ( #include <winsock2.h> )
: 무한루프 사용하는 부분도 없구요.
:
: 수신부분 아래 소스 일부 첨부했습니다.    
: for 안에  Application->Processmessages(); 이함수를 추가해봤습니다.
: 프로그램을 시작하면 장비와 연결하고 데이타 수신할때 바로 프로그램이 종료가 되어버립니다.
:
: 몇주일째 고생을 하고 있습니다.
: 원인부분만 정확히 알아도 이렇게 답답하지는 않을것 같네요.
: 왜 그런지 전혀 감이 안오네요.
:
: 환경은 개발은 window xp 에서 했구요.
: 서버환경은 windox 2003, sql 2000 서버입니다.
: 감시프로그램은 서버에서 구동하고 있구요.
: 서버 pc는 hp 제품입니다.
:
: 아시는분 부탁드립니다.
:
: void cSockUtil::read_sock()
: {
:   중략...
:     
:      for(int i=0; i<장비총갯수; i++)
:      {
:           if(cli[i].in_use == NO_SOCK)
:                continue;
:
:     FD_SET(cli[i].cli_sock, &fd_read);
:     FD_SET(cli[i].cli_sock, &fd_except);
:     nfds = i;
:            s = select(nfds, &fd_read, NULL, &fd_except, &tout);

:            // Application->Processmessages();
:           
:            if(s > 0)
:           {
:                if( FD_ISSET(cli[i].cli_sock, &fd_except) )
:                {
:                 #ifdef DEBUG
:                 #endif
:                     close_sock(i);
:             }
:             if( (FD_ISSET(cli[i].cli_sock, &fd_read)) )
:                 read_sock(i);
:         }// if s
:
:
:      }
: }
: //-------------------------------
:
: void cSockUtil::read_sock(int s)
: {
:     char buf[1024];
:     int rtn;
:
:     memset(buf, 0x00, sizeof(buf));
:     rtn = recv(cli[s].cli_sock, buf, 1024, 0);
:
:     if(rtn<=0) {
:                 #ifdef DEBUG
:                 sprintf(m_szDebugBuf, "Client 읽기 실패 from: %s, Return: %d",
:                 inet_ntoa(cli[s].cli_addr.sin_addr), rtn);
:
:                 #endif
:                 FD_CLR(cli[s].cli_sock, &fd_read);
:
:                 close_sock(s);
:     }
:     else
:         tpoll.Receiver(s, rtn, buf); // 데이타 처리 함수 호출
: }
: //---------------------------------------------------------------------------

+ -

관련 글 리스트
40513 [질문] 응답없음 (제발 꼭 봐주세요.) 초보자 1198 2005/06/11
40553     Re:[질문] 응답없음 (제발 꼭 봐주세요.) evergreen 1333 2005/06/14
40554         Re:Re:답변 감사합니다. ( NonBlocking mode으로 어떻게 바꿔야 할지?) 초보자 1317 2005/06/14
40561             Re:Re:Re:답변 감사합니다. ( NonBlocking mode으로 어떻게 바꿔야 할지?) evergreen 1397 2005/06/14
40573                 Re:Re:Re:Re:감사합니다. 초보자 994 2005/06/15
40547     Re:[질문] 응답없음 (제발 꼭 봐주세요.) evergreen 1104 2005/06/14
40549         Re:Re: 답변 감사하구요. (아래 내용 한번 봐주실래요.) 초보자 920 2005/06/14
40515     Re:[질문] 응답없음 (제발 꼭 봐주세요.) 이성제 949 2005/06/12
40516         Re:Re:[질문] 소켓을 2개 동시에 오픈했다는 의미가 ? 초보자 966 2005/06/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.