Files
2026-08-07 17:38:18 +09:00

151 lines
4.2 KiB
C++

#include <stdlib.h>
#include <string>
#include <map>
#include <iterator>
#include "Logger.h"
#include "../FtsdSocketControl.h"
#define LOG_PATH "/user/service/logs" // Log 파일은 /user/service/logs/sample/sample_날짜.log 로 생성됨.
#define TRANSFER_LISTEN_PORT 14001 // ftsd 의 Listen Port
int main()
{
///////////// 1. 기본 정보 설정 ///////////////////
// Source 장비 Host Name
std::string szSourceHostName = "sb-02-fhs001.solbox.com";
// Source 파일명 ( Mount 위치까지 포함함 전체 경로 )
std::string szFileName = "/stg/node2/66/8bed0cb840eb9a5f2b1eab790e9a3c53";
////////////// 결과값을 저장할 변수 //////////////////
long nFileSize = 0;
long nAccessTime = 0;
long nModifyTime = 0;
long nChangeTime = 0;
// 오류 메시지
std::string szErrorMessage;
////////////// Sample 코드 //////////////
// Log 처리용 객체 생성 및 초기화.
if( CLogger::Init( PROG_NAME, LOG_PATH, LDBG ) == false )
{
std::cout << "[error] Logger object created failed.." << std::endl;
return 0;
}
// Start logging
_LOG( LINF, "ftsd stat sample Start: Source[%s]", szFileName.c_str());
// ftsd 와 통신을 처리할 Socket Control 객체 생성 및 접속
CFtsdSocketControl ftsdSocket;
if( ftsdSocket.ConnectTarget( szSourceHostName, TRANSFER_LISTEN_PORT ) == false )
{
// Source ftsd 으로 접속 실패시
_LOG( LERR, "Source FHS connect fail. [%s][%d]", szSourceHostName.c_str(), TRANSFER_LISTEN_PORT );
return EXIT_FAILURE;
}
// ftsd 로 파일에 대한 stat 요청 전달
// SendFileCheckRequest() 함수는 FtsdSocketControl.h 파일 참조.
if( ftsdSocket.SendFileStatRequest( szFileName) == false )
{
// Source ftsd 로 전송 실패시
_LOG( LERR, "Stat Request send fail.[%s][%s]", szSourceHostName.c_str(), szFileName.c_str());
return EXIT_FAILURE;
}
// 요청에 대한 응답 대기
int nTimeout = 10; // 응답 대기 시간 ( sec )
int nResult = 0;
bool bResultSuccess; // 처리 결과의 성공/실패 여부를 저장하기 위한 변수.
// 루프를 돌면서 요청에 대한 응답을 대기
while(1)
{
// nTimeout 에 지정된 시간동안 응답대기 시도
// GetFileStatResult() 함수는 SocketControl.h 파일 참고.
nResult = ftsdSocket.GetFileStatResult( nTimeout, bResultSuccess, szErrorMessage, nFileSize, nAccessTime, nModifyTime, nChangeTime );
if( nResult == -1 )
{
// Socket 통신 관련 오류 또는 접속 종료가 발생한 경우.
// 해당 내역 로깅 및 루프 종료
_LOG( LERR, "ftsd Response wait fail by socket [%s][%s]", szSourceHostName.c_str(), szFileName.c_str() );
break;
}
else if( nResult == 0 )
{
// 지정된 시간 동안 응답대기 중 처리 결과 정보가 아직 수신되지 않은 경우 => Allive Check 패킷 한번 쏘고 다시 Loop 로
if( ftsdSocket.SendAliveCheck() == false )
{
// Alive 전송 실패시 => Socket 종료 및 오류가 발생한 경우임.
_LOG( LERR, "ftsd Response wait fail by socket2 [%s][%s]", szSourceHostName.c_str(), szFileName.c_str() );
break;
}
// 정상적인 경우 다시 응답대기.
continue;
}
else if( nResult == 1 )
{
// 요청에 대한 처리결과 정보가 수신된 경우.
// 해당 정보 로깅처리.
if( bResultSuccess == true )
{
// 요청에 대한 처리가 정상적으로 처리된 경우
_LOG( LINF, "Result size [%ld] access[%ld] modify[%ld] change[%ld]"
, nFileSize, nAccessTime, nModifyTime, nChangeTime );
}
else
{
// 오류 발생시
_LOG( LINF, "[%s][%s] Result ERROR [%s]", szFileName.c_str(), szSourceHostName.c_str(), szErrorMessage.c_str() );
}
break; // 응답을 받았으니 응답 대기 루프 종료
}
else
{
// Stat 요청에 대한 응답패킷이 아닌 경우.
// 해당 패킷은 무시하고 다시 Loop 로
continue;
}
}
// ftsd socket 종료
ftsdSocket.Close();
// End logging
_LOG( LINF, "ftsd stat sample process End [%s][%s]", szSourceHostName.c_str(), szFileName.c_str());
_LOG( LINF, "-------------------------------------------------------------------------------" );
CLogger::Exit();
return EXIT_SUCCESS;
}