|
답변 감사드리구요. 로그를 남기도록 수정해서 걸어봐야 겠네요.
그런제 제대로 로그가 남을수 있을지 모르겠네요.
응답없음 상태가 되면 전혀 데이타 처리를 못하는데 파일에 저장이 될지 모르겠어요.
한번 응답없음 상태가 되면 계속 그 상태로 남아 있거든요.
재접속하는 부분에 시간이 지난후에 문제가 생길까 해서 아래처럼 재접속하는 부분을 막았거든요.
그래도 마찬가지 입니다.
아래 함수는 몇분동안 데이타가 들어오지 않으면 다시 연결을 시도하는 내용입니다.
물론 데이타가 들어오면 그시간이 m_clksaved[i]에 저장되구요.
혹시 아래 내용에 문제가 있나요?
의심되는 부분이 있으면 알려주세요. 부탁드립니다.
clock_t m_clksaved[100];
// 장비 재접속
void __fastcall TfrmMain::tmr_SendTimer(TObject *Sender) // 타이머에 의해서 몇초간격으로 실행
{
for(int i = 0; i < 장비수; i++)
{
if(((clock() - m_clksaved[i]) / CLK_TCK) >= 180) // 3분 (시간을 늘려도 마찬가지임)
{
m_clksaved[i] = clock();
// Re_Connect(i); // <= 이부분이 재연결 함수 호출하는 부분
}
}//for
}
//---------------------------------------------------------------------------
void TfrmMain::Re_Connect(int nsock)
{
int nresult;
String str;
if(cli[nsock].in_use == YES_SOCK) // 연결상태면 Close 한후에 재연결
tSockUtil.close_Re_sock(nsock);
tSockUtil.open_Re_sock(nsock);
nresult = tSockUtil.connect_sock(str_Ip[nsock].c_str(), n_Port[nsock], nsock);
if(nresult < 0)
{
str = frmMain->str_SiteName[nsock]+" ";
str += "연결실패";
tbuff.set_msgdbg(str);
}
}
//---------------------------------------------------------------------------
void cSockUtil::close_Re_sock(int nsock)
{
closesocket(cli[nsock].cli_sock); // Client Socket 번호
cli[nsock].in_use = NO_SOCK;
WSACleanup();
}
//---------------------------------------------------------------------------
void cSockUtil::open_Re_sock(int nsock)
{
WSADATA wsaData;
if( WSAStartup(MAKEWORD(2, 0), &wsaData) ) {
#ifdef DEBUG
#endif
return;
}
cli[nsock].in_use = NO_SOCK;
}
//---------------------------------------------------------------------------
int cSockUtil::connect_sock(char *szipaddr, int nport, int n)
{
int nret;
String str;
if(cli_conn > MAX_CLIENT) // MAX_CLIENT 최대 장비수
return 1;
cli[n].cli_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
cli[n].cli_addr.sin_family = AF_INET;
cli[n].cli_addr.sin_addr.s_addr = inet_addr(szipaddr);
cli[n].cli_addr.sin_port = htons(nport);
// 아래 연결부분이 끊어졌을때 1개당 20초 걸립니다.
if( connect(cli[n].cli_sock, (LPSOCKADDR)&cli[n].cli_addr, sizeof(cli[n].cli_addr)) < 0)
{
cli[n].in_use = NO_SOCK;
return -1;
}
cli[n].in_use = YES_SOCK;
tbuff.set_clilog(); // listview에 연결상태 보여주는 함수.
return cli[n].cli_sock;
}
//---------------------------------------------------------------------------
evergreen 님이 쓰신 글 :
: 안녕하세요 heredity입니다. 난해한 문제로 고생하고 계시는 군요.
: 아래의 내용을 참조하세요.
:
: 1. 장비 재 접속시 접속 될때까지 루프를 돌면서 검사하게 프로그래밍 되어 있는지
: 확인 하시고(재 접속시 1분 정도 "응답없음"으로 나오는 것으로 볼때 충분히 가능성 있음),
: 만약 그렇게 되어 있다면 접속이 안 될 경우 무한루프에 빠질 수 있습니다.
:
: 2. Log를 남기십시오. 동일한 패턴의 오류는 쉽게 잡을 수 있지만
: 그렇지 않은 경우엔 의심가는 곳에 Log를 남기도록 프로그래밍하는 것이 좋습니다.
:
: 예> 재 접속 처리부를 예로 들면
: :
: MyLog( " 재접속 처리부 시작_0" ); // MyLog()는 특정 File에 저장일 + 저장 시간 포함해서 입력 문자열을 File의 끝에 추가는 Function으로 예전에 만들어 둔 것을 찾을 수 없어 첨부할 수가 없군요.
: :
: MyLog( " 재접속 처리부 시작_1" );
: :
: MyLog( " 재접속 처리부 시작_2" );
: :
: MyLog( " 재접속 처리부 끝_2" );
: :
: MyLog( " 재접속 처리부 끝_1" );
: :
: MyLog( " 재접속 처리부 끝_0" );
: :
: 와 같이 한 후 프로그램이 "음답없음" 상태가 되면 Log File을 뒤져 어디까지 실행 됐는지
: 확인해 보면 "응답없음"의 원인을 발견 할 수 있을 겁니다.
:
: 즐~
:
|