文章目录
- 1._public.h
- 2._public.cpp
- 3._cmpublic.h
1._public.h
#ifndef _PUBLIC_H
#define _PUBLIC_H 1
#include "_cmpublic.h"
struct st_fileinfo
{
char filename[301];
int filesize;
char mtime[21];
};
class CDir
{
public:
char m_DirName[301];
char m_FileName[301];
char m_FullFileName[301];
int m_FileSize;
char m_ModifyTime[21];
char m_CreateTime[21];
char m_AccessTime[21];
int m_uPOS;
vector<string> m_vFileName;
CDir();
void initdata();
char m_DateFMT[21];
void SetDateFMT(const char *in_DateFMT);
bool OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount=10000,const bool bAndChild=false,bool bSort=false);
bool _OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild);
bool ReadDir();
~CDir();
};
char *STRCPY(char* dest,const size_t destlen,const char* src);
char *STRNCPY(char* dest,const size_t destlen,const char* src,size_t n);
char *STRCAT(char* dest,const size_t destlen,const char* src);
char *STRNCAT(char* dest,const size_t destlen,const char* src,size_t n);
int SNPRINTF(char *str, size_t size, const char *fmt, ...);
int timetostr(const time_t ti,char *strtime);
int strtotime(const char *strtime,time_t *ti);
bool FGETS(const FILE *fp,char *strBuffer,const int ReadSize,const char *strEndStr=0);
class CFile
{
private:
FILE *m_fp;
bool m_bEnBuffer;
char m_filename[301];
char m_filenametmp[301];
public:
CFile();
~CFile();
bool IsOpened();
bool Open(const char *filename,const char *openmode,bool bEnBuffer=true);
bool CloseAndRemove();
bool OpenForRename(const char *filename,const char *openmode,bool bEnBuffer=true);
bool CloseAndRename();
void Fprintf(const char *fmt, ... );
bool Fgets(char *strBuffer,const int ReadSize,bool bDelCRT=false);
bool FFGETS(char *strBuffer,const int ReadSize,const char *strEndStr=0);
size_t Fread(void *ptr,size_t size);
size_t Fwrite(const void *ptr,size_t size);
void Close();
};
class CCmdStr
{
public:
vector<string> m_vCmdStr;
CCmdStr();
void SplitToCmd(const string in_string,const char *in_sep,const bool bdeletespace=true);
int CmdCount();
bool GetValue(const int inum,char *in_return);
bool GetValue(const int inum,char *in_return,const int in_len);
bool GetValue(const int inum,int *in_return);
bool GetValue(const int inum,long *in_return);
bool GetValue(const int inum,double *in_return);
~CCmdStr();
};
void DeleteLChar(char *in_string,const char in_char);
void DeleteRChar(char *in_string,const char in_char);
void DeleteLRChar(char *in_string,const char in_char);
void LocalTime(char *out_stime,const char *in_fmt=0,const int in_interval=0);
#define MAXLOGFSIZE 100
class CLogFile
{
public:
FILE *m_tracefp;
char m_filename[301];
char m_openmode[11];
bool m_bBackup;
bool m_bEnBuffer;
CLogFile();
bool Open(const char *in_filename,const char *in_openmode,bool bBackup=true,bool bEnBuffer=false);
bool BackupLogFile();
bool Write(const char *fmt,...);
bool WriteEx(const char *fmt,...);
void Close();
~CLogFile();
};
void CloseIOAndSignal();
bool MKDIR(const char *pathorfilename,bool bisfilename=true);
bool REMOVE(const char *in_filename,const int in_times=3);
bool RENAME(const char *in_srcfilename,const char *in_dstfilename,const int in_times=3);
bool COPY(const char *srcfilename,const char *dstfilename);
FILE *FOPEN(const char *filename,const char *mode);
int FileSize(const char *in_FullFileName);
void FileMTime(const char *in_FullFileName,char *out_ModTime);
int UTime(const char *filename,const char *mtime);
time_t UTCTime(const char *stime);
void PickNumber(const char *strSrc,char *strDst,const bool bWithSign,const bool bWithDOT);
bool JudgeSignDOT(const char *strSrc,const char *strBZ);
int AddTime(const char *in_stime,char *out_stime,const int in_interval,const char *in_fmt=0);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,bool *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,int *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned int *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,long *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned long *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,double *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value,const int in_StrLen=0);
bool MatchFileName(const string in_FileName,const string in_MatchStr);
void ToUpper(char *str);
void ToUpper(string &str);
void ToLower(char *str);
void ToLower(string &str);
void UpdateStr(char *in_string,const char *in_str1,const char *in_str2,bool bLoop=true);
class CTcpClient
{
public:
int m_sockfd;
char m_ip[21];
int m_port;
bool m_state;
bool m_btimeout;
int m_buflen;
CTcpClient();
bool ConnectToServer(const char *ip,const int port);
bool Read(char *buffer,const int itimeout=0);
bool Write(const char *buffer,const int ibuflen=0);
void Close();
~CTcpClient();
};
class CTcpServer
{
private:
int m_socklen;
struct sockaddr_in m_clientaddr;
struct sockaddr_in m_servaddr;
public:
int m_listenfd;
int m_connfd;
bool m_btimeout;
int m_buflen;
CTcpServer();
bool InitServer(const unsigned int port);
bool Accept();
char *GetIP();
bool Read(char *buffer,const int itimeout);
bool Write(const char *buffer,const int ibuflen=0);
void CloseListen();
void CloseClient();
~CTcpServer();
};
bool TcpRead(const int sockfd,char *buffer,int *ibuflen,const int itimeout=0);
bool TcpWrite(const int sockfd,const char *buffer,const int ibuflen=0);
bool Readn(const int sockfd,char *buffer,const size_t n);
bool Writen(const int sockfd,const char *buffer,const size_t n);
class CTimer
{
public:
struct timeval m_start,m_end;
CTimer();
void Start();
double Elapsed();
};
#endif
2._public.cpp
#include "_public.h"
int SNPRINTF(char *str, size_t size, const char *fmt, ...)
{
memset(str,0,size+1);
va_list arg;
va_start( arg, fmt );
vsnprintf( str,size, fmt, arg );
va_end( arg );
}
char *STRCPY(char* dest,const size_t destlen,const char* src)
{
memset(dest,0,destlen+1);
if (strlen(src)>destlen) strncpy(dest,src,destlen);
else strcpy(dest,src);
return dest;
}
char *STRNCPY(char* dest,const size_t destlen,const char* src,size_t n)
{
memset(dest,0,destlen+1);
if (n>destlen) strncpy(dest,src,destlen);
else strncpy(dest,src,n);
return dest;
}
char *STRCAT(char* dest,const size_t destlen,const char* src)
{
memset(dest+strlen(dest),0,destlen-strlen(dest)+1);
int left=destlen-strlen(dest);
int len=0;
if (strlen(src)>left) len=left;
else len=strlen(src);
strncat(dest,src,len);
return dest;
}
char *STRNCAT(char* dest,const size_t destlen,const char* src,size_t n)
{
memset(dest+strlen(dest),0,destlen-strlen(dest)+1);
int left=destlen-strlen(dest);
int len=0;
if (n>left) len=left;
else len=n;
strncat(dest,src,len);
return dest;
}
int timetostr(const time_t ti,char *strtime)
{
struct tm *sttm;
if ( (sttm=localtime(&ti))==0 ) return -1;
sprintf(strtime,"%d-%02d-%02d %02d:%02d:%02d",\
sttm->tm_year+1900,sttm->tm_mon+1,sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);
return 0;
}
int strtotime(const char *strtime,time_t *ti)
{
char strtmp[11];
struct tm sttm;
memset(strtmp,0,sizeof(strtmp));
strncpy(strtmp,strtime,4);
sttm.tm_year=atoi(strtmp)-1900;
memset(strtmp,0,sizeof(strtmp));
strncpy(strtmp,strtime+5,2);
sttm.tm_mon=atoi(strtmp)-1;
memset(strtmp,0,sizeof(strtmp));
strncpy(strtmp,strtime+8,2);
sttm.tm_mday=atoi(strtmp);
memset(strtmp,0,sizeof(strtmp));
strncpy(strtmp,strtime+11,2);
sttm.tm_hour=atoi(strtmp);
memset(strtmp,0,sizeof(strtmp));
strncpy(strtmp,strtime+14,2);
sttm.tm_min=atoi(strtmp);
memset(strtmp,0,sizeof(strtmp));
strncpy(strtmp,strtime+17,2);
sttm.tm_sec=atoi(strtmp);
*ti=mktime(&sttm);
return *ti;
}
CFile::CFile()
{
m_fp=0;
m_bEnBuffer=true;
memset(m_filename,0,sizeof(m_filename));
memset(m_filenametmp,0,sizeof(m_filenametmp));
}
void CFile::Close()
{
if (m_fp==0) return;
fclose(m_fp);
m_fp=0;
memset(m_filename,0,sizeof(m_filename));
if (strlen(m_filenametmp)!=0) remove(m_filenametmp);
memset(m_filenametmp,0,sizeof(m_filenametmp));
}
bool CFile::IsOpened()
{
if (m_fp==0) return false;
return true;
}
bool CFile::CloseAndRemove()
{
if (m_fp==0) return true;
fclose(m_fp);
m_fp=0;
if (remove(m_filename) != 0) { memset(m_filename,0,sizeof(m_filename)); return false; }
memset(m_filename,0,sizeof(m_filename));
return true;
}
CFile::~CFile()
{
Close();
}
bool CFile::Open(const char *filename,const char *openmode,bool bEnBuffer)
{
Close();
if ( (m_fp=FOPEN(filename,openmode)) == 0 ) return false;
memset(m_filename,0,sizeof(m_filename));
strncpy(m_filename,filename,300);
m_bEnBuffer=bEnBuffer;
return true;
}
bool CFile::OpenForRename(const char *filename,const char *openmode,bool bEnBuffer)
{
Close();
memset(m_filename,0,sizeof(m_filename));
strncpy(m_filename,filename,300);
memset(m_filenametmp,0,sizeof(m_filenametmp));
SNPRINTF(m_filenametmp,300,"%s.tmp",m_filename);
if ( (m_fp=FOPEN(m_filenametmp,openmode)) == 0 ) return false;
m_bEnBuffer=bEnBuffer;
return true;
}
bool CFile::CloseAndRename()
{
if (m_fp==0) return false;
fclose(m_fp);
m_fp=0;
if (rename(m_filenametmp,m_filename) != 0)
{
remove(m_filenametmp);
memset(m_filename,0,sizeof(m_filename));
memset(m_filenametmp,0,sizeof(m_filenametmp));
return false;
}
memset(m_filename,0,sizeof(m_filename));
memset(m_filenametmp,0,sizeof(m_filenametmp));
return true;
}
void CFile::Fprintf(const char *fmt, ... )
{
if ( m_fp == 0 ) return;
va_list arg;
va_start( arg, fmt );
vfprintf( m_fp, fmt, arg );
va_end( arg );
if ( m_bEnBuffer == false ) fflush(m_fp);
}
bool CFile::Fgets(char *strBuffer,const int ReadSize,bool bDelCRT)
{
if ( m_fp == 0 ) return false;
memset(strBuffer,0,ReadSize+1);
if (fgets(strBuffer,ReadSize,m_fp) == 0) return false;
if (bDelCRT==true)
{
DeleteRChar(strBuffer,'\n'); DeleteRChar(strBuffer,'\r');
}
return true;
}
bool CFile::FFGETS(char *strBuffer,const int ReadSize,const char *strEndStr)
{
return FGETS(m_fp,strBuffer,ReadSize,strEndStr);
}
size_t CFile::Fread(void *ptr, size_t size)
{
if ( m_fp == 0 ) return -1;
return fread(ptr,1,size,m_fp);
}
size_t CFile::Fwrite(const void *ptr, size_t size )
{
if ( m_fp == 0 ) return -1;
size_t tt=fwrite(ptr,1,size,m_fp);
if ( m_bEnBuffer == false ) fflush(m_fp);
return tt;
}
bool FGETS(const FILE *fp,char *strBuffer,const int ReadSize,const char *strEndStr)
{
char strLine[ReadSize+1];
memset(strLine,0,sizeof(strLine));
while (true)
{
memset(strLine,0,ReadSize+1);
if (fgets(strLine,ReadSize,(FILE *)fp) == 0) break;
if ( (strlen(strBuffer)+strlen(strLine)) >= (unsigned int)ReadSize ) break;
strcat(strBuffer,strLine);
if (strEndStr == 0) return true;
if (strstr(strLine,strEndStr)!= 0) return true;
}
return false;
}
CCmdStr::CCmdStr()
{
m_vCmdStr.clear();
}
void CCmdStr::SplitToCmd(const string in_string,const char *in_sep,const bool bdeletespace)
{
m_vCmdStr.clear();
int iPOS=0;
string srcstr,substr;
srcstr=in_string;
char str[2048];
while ( (iPOS=srcstr.find(in_sep)) >= 0)
{
substr=srcstr.substr(0,iPOS);
if (bdeletespace == true)
{
memset(str,0,sizeof(str));
strncpy(str,substr.c_str(),2000);
DeleteLRChar(str,' ');
substr=str;
}
m_vCmdStr.push_back(substr);
iPOS=iPOS+strlen(in_sep);
srcstr=srcstr.substr(iPOS,srcstr.size()-iPOS);
}
substr=srcstr;
if (bdeletespace == true)
{
memset(str,0,sizeof(str));
strncpy(str,substr.c_str(),2000);
DeleteLRChar(str,' ');
substr=str;
}
m_vCmdStr.push_back(substr);
return;
}
int CCmdStr::CmdCount()
{
return m_vCmdStr.size();
}
bool CCmdStr::GetValue(const int inum,char *in_return)
{
if (inum >= m_vCmdStr.size()) return false;
strcpy(in_return,m_vCmdStr[inum].c_str());
return true;
}
bool CCmdStr::GetValue(const int inum,char *in_return,const int in_len)
{
memset(in_return,0,in_len+1);
if (inum >= m_vCmdStr.size()) return false;
if (m_vCmdStr[inum].length() > (unsigned int)in_len)
{
strncpy(in_return,m_vCmdStr[inum].c_str(),in_len);
}
else
{
strcpy(in_return,m_vCmdStr[inum].c_str());
}
return true;
}
bool CCmdStr::GetValue(const int inum,int *in_return)
{
(*in_return) = 0;
if (inum >= m_vCmdStr.size()) return false;
(*in_return) = atoi(m_vCmdStr[inum].c_str());
return true;
}
bool CCmdStr::GetValue(const int inum,long *in_return)
{
(*in_return) = 0;
if (inum >= m_vCmdStr.size()) return false;
(*in_return) = atol(m_vCmdStr[inum].c_str());
return true;
}
bool CCmdStr::GetValue(const int inum,double *in_return)
{
(*in_return) = 0;
if (inum >= m_vCmdStr.size()) return false;
(*in_return) = (double)atof(m_vCmdStr[inum].c_str());
return true;
}
CCmdStr::~CCmdStr()
{
m_vCmdStr.clear();
}
void DeleteLChar(char *in_string,const char in_char)
{
if (in_string == 0) return;
if (strlen(in_string) == 0) return;
char strTemp[strlen(in_string)+1];
int iTemp=0;
memset(strTemp,0,sizeof(strTemp));
strcpy(strTemp,in_string);
while ( strTemp[iTemp] == in_char ) iTemp++;
memset(in_string,0,strlen(in_string)+1);
strcpy(in_string,strTemp+iTemp);
return;
}
void DeleteRChar(char *in_string,const char in_char)
{
if (in_string == 0) return;
int istrlen = strlen(in_string);
while (istrlen>0)
{
if (in_string[istrlen-1] != in_char) break;
in_string[istrlen-1]=0;
istrlen--;
}
}
void DeleteLRChar(char *in_string,const char in_char)
{
DeleteLChar(in_string,in_char);
DeleteRChar(in_string,in_char);
}
void LocalTime(char *out_stime,const char *in_fmt,const int in_interval)
{
if (in_fmt == 0) memset(out_stime,0,19+1);
else memset(out_stime,0,strlen(in_fmt)+1);
time_t timer;
struct tm nowtimer;
time( &timer ); timer=timer+in_interval;
nowtimer = *localtime ( &timer ); nowtimer.tm_mon++;
if (in_fmt==0)
{
snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min,nowtimer.tm_sec);
return;
}
if (strcmp(in_fmt,"yyyy-mm-dd hh24:mi:ss") == 0)
{
snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min,nowtimer.tm_sec);
return;
}
if (strcmp(in_fmt,"yyyy-mm-dd hh24:mi") == 0)
{
snprintf(out_stime,17,"%04u-%02u-%02u %02u:%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min);
return;
}
if (strcmp(in_fmt,"yyyy-mm-dd hh24") == 0)
{
snprintf(out_stime,14,"%04u-%02u-%02u %02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour);
return;
}
if (strcmp(in_fmt,"yyyy-mm-dd") == 0)
{
snprintf(out_stime,11,"%04u-%02u-%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return;
}
if (strcmp(in_fmt,"yyyy-mm") == 0)
{
snprintf(out_stime,8,"%04u-%02u",nowtimer.tm_year+1900,nowtimer.tm_mon); return;
}
if (strcmp(in_fmt,"yyyymmddhh24miss") == 0)
{
snprintf(out_stime,15,"%04u%02u%02u%02u%02u%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min,nowtimer.tm_sec);
return;
}
if (strcmp(in_fmt,"yyyymmddhh24mi") == 0)
{
snprintf(out_stime,13,"%04u%02u%02u%02u%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min);
return;
}
if (strcmp(in_fmt,"yyyymmddhh24") == 0)
{
snprintf(out_stime,11,"%04u%02u%02u%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour);
return;
}
if (strcmp(in_fmt,"yyyymmdd") == 0)
{
snprintf(out_stime,9,"%04u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return;
}
if (strcmp(in_fmt,"hh24miss") == 0)
{
snprintf(out_stime,7,"%02u%02u%02u",nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec); return;
}
if (strcmp(in_fmt,"hh24mi") == 0)
{
snprintf(out_stime,5,"%02u%02u",nowtimer.tm_hour,nowtimer.tm_min); return;
}
if (strcmp(in_fmt,"hh24") == 0)
{
snprintf(out_stime,3,"%02u",nowtimer.tm_hour); return;
}
if (strcmp(in_fmt,"mi") == 0)
{
snprintf(out_stime,3,"%02u",nowtimer.tm_min); return;
}
}
CLogFile::CLogFile()
{
m_tracefp = 0;
memset(m_filename,0,sizeof(m_filename));
memset(m_openmode,0,sizeof(m_openmode));
m_bBackup=true;
m_bEnBuffer=false;
}
CLogFile::~CLogFile()
{
Close();
}
void CLogFile::Close()
{
if (m_tracefp != 0)
{
fclose(m_tracefp); m_tracefp=0;
}
}
bool CLogFile::Open(const char *in_filename,const char *in_openmode,bool bBackup,bool bEnBuffer)
{
if (m_tracefp != 0) { fclose(m_tracefp); m_tracefp=0; }
m_bEnBuffer=bEnBuffer;
memset(m_filename,0,sizeof(m_filename));
strcpy(m_filename,in_filename);
memset(m_openmode,0,sizeof(m_openmode));
strcpy(m_openmode,in_openmode);
if ((m_tracefp=FOPEN(m_filename,m_openmode)) == NULL) return false;
m_bBackup=bBackup;
return true;
}
bool CLogFile::BackupLogFile()
{
if (m_bBackup == false) return true;
if (m_tracefp == 0) return true;
fseek(m_tracefp,0L,2);
if (ftell(m_tracefp) > MAXLOGFSIZE*1024*1024)
{
fclose(m_tracefp); m_tracefp=0;
char strLocalTime[21];
memset(strLocalTime,0,sizeof(strLocalTime));
LocalTime(strLocalTime,"yyyymmddhhmiss");
char bak_filename[301];
memset(bak_filename,0,sizeof(bak_filename));
snprintf(bak_filename,300,"%s.%s",m_filename,strLocalTime);
rename(m_filename,bak_filename);
printf("rename %s m_filename ok\n",bak_filename);
if ((m_tracefp=FOPEN(m_filename,m_openmode)) == NULL) return false;
}
return true;
}
bool CLogFile::Write(const char *fmt,...)
{
if (BackupLogFile() == false) return false;
char strtime[20]; LocalTime(strtime);
va_list ap;
va_start(ap,fmt);
if (m_tracefp == 0)
{
fprintf(stdout,"%s ",strtime);
vfprintf(stdout,fmt,ap);
if (m_bEnBuffer==false) fflush(stdout);
}
else
{
fprintf(m_tracefp,"%s ",strtime);
vfprintf(m_tracefp,fmt,ap);
if (m_bEnBuffer==false) fflush(m_tracefp);
}
va_end(ap);
return true;
}
bool CLogFile::WriteEx(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
if (m_tracefp == 0)
{
vfprintf(stdout,fmt,ap);
if (m_bEnBuffer==false) fflush(stdout);
}
else
{
vfprintf(m_tracefp,fmt,ap);
if (m_bEnBuffer==false) fflush(m_tracefp);
}
va_end(ap);
return true;
}
void CloseIOAndSignal()
{
int ii=0;
for (ii=0;ii<50;ii++)
{
signal(ii,SIG_IGN); close(ii);
}
}
bool MKDIR(const char *filename,bool bisfilename)
{
char strPathName[301];
for (int ii=1; ii<strlen(filename);ii++)
{
if (filename[ii] != '/') continue;
memset(strPathName,0,sizeof(strPathName));
strncpy(strPathName,filename,ii);
if (access(strPathName,F_OK) == 0) continue;
if (mkdir(strPathName,00755) != 0) return false;
}
if (bisfilename==false)
{
if (access(filename,F_OK) != 0)
{
if (mkdir(filename,00755) != 0) return false;
}
}
return true;
}
FILE *FOPEN(const char *filename,const char *mode)
{
if (MKDIR(filename) == false) return NULL;
return fopen(filename,mode);
}
int FileSize(const char *in_FullFileName)
{
struct stat st_filestat;
if (stat(in_FullFileName,&st_filestat) < 0) return -1;
return st_filestat.st_size;
}
int UTime(const char *filename,const char *mtime)
{
struct utimbuf stutimbuf;
stutimbuf.actime=stutimbuf.modtime=UTCTime(mtime);
return utime(filename,&stutimbuf);
}
time_t UTCTime(const char *stime)
{
char strtime[21],yyyy[5],mm[3],dd[3],hh[3],mi[3],ss[3];
memset(strtime,0,sizeof(strtime));
memset(yyyy,0,sizeof(yyyy));
memset(mm,0,sizeof(mm));
memset(dd,0,sizeof(dd));
memset(hh,0,sizeof(hh));
memset(mi,0,sizeof(mi));
memset(ss,0,sizeof(ss));
PickNumber(stime,strtime,false,false);
if (strlen(strtime) != 14) return -1;
strncpy(yyyy,strtime,4);
strncpy(mm,strtime+4,2);
strncpy(dd,strtime+6,2);
strncpy(hh,strtime+8,2);
strncpy(mi,strtime+10,2);
strncpy(ss,strtime+12,2);
struct tm time_str;
time_str.tm_year = atoi(yyyy) - 1900;
time_str.tm_mon = atoi(mm) - 1;
time_str.tm_mday = atoi(dd);
time_str.tm_hour = atoi(hh);
time_str.tm_min = atoi(mi);
time_str.tm_sec = atoi(ss);
time_str.tm_isdst = 0;
return mktime(&time_str);
}
void PickNumber(const char *strSrc,char *strDst,const bool bWithSign,const bool bWithDOT)
{
char strtemp[1024];
memset(strtemp,0,sizeof(strtemp));
strncpy(strtemp,strSrc,1000);
DeleteLRChar(strtemp,' ');
if ( (bWithSign==true) && (JudgeSignDOT(strtemp,"-") == false) )
{
strcpy(strDst,""); return;
}
if ( (bWithSign==true) && (JudgeSignDOT(strtemp,"+") == false) )
{
strcpy(strDst,""); return;
}
if ( (bWithDOT==true) && (JudgeSignDOT(strtemp,".") == false) )
{
strcpy(strDst,""); return;
}
int iPosSrc,iPosDst,iLen;
iPosSrc=iPosDst=iLen=0;
iLen=strlen(strtemp);
for (iPosSrc=0;iPosSrc<iLen;iPosSrc++)
{
if ( (bWithSign==true) && (strtemp[iPosSrc] == '+') )
{
strDst[iPosDst++]=strtemp[iPosSrc]; continue;
}
if ( (bWithSign==true) && (strtemp[iPosSrc] == '-') )
{
strDst[iPosDst++]=strtemp[iPosSrc]; continue;
}
if ( (bWithDOT==true) && (strtemp[iPosSrc] == '.') )
{
strDst[iPosDst++]=strtemp[iPosSrc]; continue;
}
if (isdigit(strtemp[iPosSrc])) strDst[iPosDst++]=strtemp[iPosSrc];
}
strDst[iPosDst]=0;
return;
}
bool JudgeSignDOT(const char *strSrc,const char *strBZ)
{
char *pos=0;
pos=(char *)strstr(strSrc,strBZ);
if (pos == 0) return true;
if (strlen(pos)==1) return false;
if ( (strcmp(strBZ,"+") == 0) && (strncmp(strSrc,"+",1) != 0) ) return false;
if ( (strcmp(strBZ,"-") == 0) && (strncmp(strSrc,"-",1) != 0) ) return false;
if (strstr(pos+1,strBZ) > 0) return false;
return true;
}
int AddTime(const char *in_stime,char *out_stime,const int in_interval,const char *in_fmt)
{
time_t timer;
struct tm nowtimer;
timer=UTCTime(in_stime)+in_interval;
nowtimer = *localtime ( &timer ); nowtimer.tm_mon++;
out_stime[0]=0;
if (in_fmt==0)
{
snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min,nowtimer.tm_sec); return 0;
}
if (strcmp(in_fmt,"yyyy-mm-dd hh24:mi:ss") == 0)
{
snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min,nowtimer.tm_sec); return 0;
}
if (strcmp(in_fmt,"yyyymmddhh24miss") == 0)
{
snprintf(out_stime,15,"%04u%02u%02u%02u%02u%02u",nowtimer.tm_year+1900,
nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,
nowtimer.tm_min,nowtimer.tm_sec); return 0;
}
if (strcmp(in_fmt,"yyyy-mm-dd") == 0)
{
snprintf(out_stime,11,"%04u-%02u-%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return 0;
}
if (strcmp(in_fmt,"yyyymmdd") == 0)
{
snprintf(out_stime,9,"%04u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return 0;
}
if (strcmp(in_fmt,"hh24:mi:ss") == 0)
{
snprintf(out_stime,9,"%02u:%02u:%02u",nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec); return 0;
}
if (strcmp(in_fmt,"hh24:mi") == 0)
{
snprintf(out_stime,9,"%02u:%02u",nowtimer.tm_hour,nowtimer.tm_min); return 0;
}
if (strcmp(in_fmt,"hh24mi") == 0)
{
snprintf(out_stime,7,"%02u%02u",nowtimer.tm_hour,nowtimer.tm_min); return 0;
}
return -1;
}
void FileMTime(const char *in_FullFileName,char *out_ModTime)
{
struct tm nowtimer;
struct stat st_filestat;
stat(in_FullFileName,&st_filestat);
nowtimer = *localtime(&st_filestat.st_mtime);
nowtimer.tm_mon++;
snprintf(out_ModTime,15,"%04u%02u%02u%02u%02u%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
}
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value,const int in_Len)
{
strcpy(out_Value,"");
char *start=NULL,*end=NULL;
char m_SFieldName[51],m_EFieldName[51];
int m_NameLen = strlen(in_FieldName);
memset(m_SFieldName,0,sizeof(m_SFieldName));
memset(m_EFieldName,0,sizeof(m_EFieldName));
snprintf(m_SFieldName,50,"<%s>",in_FieldName);
snprintf(m_EFieldName,50,"</%s>",in_FieldName);
start=0; end=0;
start = (char *)strstr(in_XMLBuffer,m_SFieldName);
if (start != 0)
{
end = (char *)strstr(start,m_EFieldName);
}
if ((start==0) || (end == 0))
{
return false;
}
int m_ValueLen = end - start - m_NameLen - 2 + 1 ;
if ( ((m_ValueLen-1) <= in_Len) || (in_Len == 0) )
{
strncpy(out_Value,start+m_NameLen+2,m_ValueLen-1); out_Value[m_ValueLen-1]=0;
}
else
{
strncpy(out_Value,start+m_NameLen+2,in_Len); out_Value[in_Len]=0;
}
DeleteLRChar(out_Value,' ');
return true;
}
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,bool *out_Value)
{
(*out_Value) = false;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,10) == true)
{
if ( (strcmp(strTemp,"true")==0) || (strcmp(strTemp,"true")==0) ) (*out_Value)=true; return true;
}
return false;
}
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,int *out_Value)
{
(*out_Value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true)
{
(*out_Value) = atoi(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned int *out_Value)
{
(*out_Value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true)
{
(*out_Value) = (unsigned int)atoi(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,long *out_Value)
{
(*out_Value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true)
{
(*out_Value) = atol(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned long *out_Value)
{
(*out_Value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true)
{
(*out_Value) = (unsigned long)atol(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,double *out_Value)
{
(*out_Value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true)
{
(*out_Value) = atof(strTemp); return true;
}
return false;
}
bool MatchFileName(const string in_FileName,const string in_MatchStr)
{
if (in_MatchStr.size() == 0) return false;
if (in_MatchStr == "*") return true;
char strTemp[2049];
memset(strTemp,0,sizeof(strTemp));
strncpy(strTemp,in_MatchStr.c_str(),2000);
int ii,jj;
int iPOS1,iPOS2;
CCmdStr CmdStr,CmdSubStr;
string strFileName,strMatchStr;
strFileName=in_FileName;
strMatchStr=strTemp;
ToUpper(strFileName);
ToUpper(strMatchStr);
CmdStr.SplitToCmd(strMatchStr,",");
for (ii=0;ii<CmdStr.CmdCount();ii++)
{
if (CmdStr.m_vCmdStr[ii].empty() == true) continue;
iPOS1=iPOS2=0;
CmdSubStr.SplitToCmd(CmdStr.m_vCmdStr[ii],"*");
for (jj=0;jj<CmdSubStr.CmdCount();jj++)
{
if (jj == 0)
{
if (strncmp(strFileName.c_str(),CmdSubStr.m_vCmdStr[jj].c_str(),CmdSubStr.m_vCmdStr[jj].size()) != 0) break;
}
if (jj == CmdSubStr.CmdCount()-1)
{
if (strcmp(strFileName.c_str()+strFileName.size()-CmdSubStr.m_vCmdStr[jj].size(),CmdSubStr.m_vCmdStr[jj].c_str()) != 0) break;
}
iPOS2=strFileName.find(CmdSubStr.m_vCmdStr[jj],iPOS1);
if (iPOS2 < 0) break;
iPOS1=iPOS2+CmdSubStr.m_vCmdStr[jj].size();
}
if (jj==CmdSubStr.CmdCount()) return true;
}
return false;
}
void ToUpper(char *str)
{
if (str == 0) return;
if (strlen(str) == 0) return;
int istrlen=strlen(str);
for (int ii=0;ii<istrlen;ii++)
{
if ( (str[ii] >= 97) && (str[ii] <= 122) ) str[ii]=str[ii] - 32;
}
}
void ToUpper(string &str)
{
if (str.empty()) return;
char strtemp[str.size()+1];
memset(strtemp,0,sizeof(strtemp));
strcpy(strtemp,str.c_str());
ToUpper(strtemp);
str=strtemp;
return;
}
void ToLower(char *str)
{
if (str == 0) return;
if (strlen(str) == 0) return;
int istrlen=strlen(str);
for (int ii=0;ii<istrlen;ii++)
{
if ( (str[ii] >= 65) && (str[ii] <= 90) ) str[ii]=str[ii] + 32;
}
}
void ToLower(string &str)
{
if (str.empty()) return;
char strtemp[str.size()+1];
memset(strtemp,0,sizeof(strtemp));
strcpy(strtemp,str.c_str());
ToLower(strtemp);
str=strtemp;
return;
}
CDir::CDir()
{
m_uPOS=0;
memset(m_DateFMT,0,sizeof(m_DateFMT));
strcpy(m_DateFMT,"yyyy-mm-dd hh24:mi:ss");
m_vFileName.clear();
initdata();
}
void CDir::initdata()
{
memset(m_DirName,0,sizeof(m_DirName));
memset(m_FileName,0,sizeof(m_FileName));
memset(m_FullFileName,0,sizeof(m_FullFileName));
m_FileSize=0;
memset(m_CreateTime,0,sizeof(m_CreateTime));
memset(m_ModifyTime,0,sizeof(m_ModifyTime));
memset(m_AccessTime,0,sizeof(m_AccessTime));
}
void CDir::SetDateFMT(const char *in_DateFMT)
{
memset(m_DateFMT,0,sizeof(m_DateFMT));
strcpy(m_DateFMT,in_DateFMT);
}
bool CDir::OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild,bool bSort)
{
m_uPOS=0;
m_vFileName.clear();
if (MKDIR(in_DirName,false) == false) return false;
bool bRet=_OpenDir(in_DirName,in_MatchStr,in_MaxCount,bAndChild);
if (bSort==true)
{
sort(m_vFileName.begin(), m_vFileName.end());
}
return bRet;
}
bool CDir::_OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild)
{
DIR *dir;
if ( (dir=opendir(in_DirName)) == NULL ) return false;
char strTempFileName[1024];
struct dirent *st_fileinfo;
struct stat st_filestat;
while ((st_fileinfo=readdir(dir)) != NULL)
{
if (st_fileinfo->d_name[0]=='.') continue;
memset(strTempFileName,0,sizeof(strTempFileName));
snprintf(strTempFileName,300,"%s//%s",in_DirName,st_fileinfo->d_name);
UpdateStr(strTempFileName,"//","/");
stat(strTempFileName,&st_filestat);
if (S_ISDIR(st_filestat.st_mode))
{
if (bAndChild == true)
{
if (_OpenDir(strTempFileName,in_MatchStr,in_MaxCount,bAndChild) == false)
{
closedir(dir); return false;
}
}
}
else
{
if (MatchFileName(st_fileinfo->d_name,in_MatchStr) == false) continue;
m_vFileName.push_back(strTempFileName);
if ( m_vFileName.size()>in_MaxCount ) break;
}
}
closedir(dir);
return true;
}
bool CDir::ReadDir()
{
initdata();
if (m_uPOS >= m_vFileName.size())
{
m_uPOS=0; m_vFileName.clear(); return false;
}
int pos=0;
pos=m_vFileName[m_uPOS].find_last_of("/");
memset(m_DirName,0,sizeof(m_DirName));
strcpy(m_DirName,m_vFileName[m_uPOS].substr(0,pos).c_str());
memset(m_FileName,0,sizeof(m_FileName));
strcpy(m_FileName,m_vFileName[m_uPOS].substr(pos+1,m_vFileName[m_uPOS].size()-pos-1).c_str());
snprintf(m_FullFileName,300,"%s",m_vFileName[m_uPOS].c_str());
struct stat st_filestat;
stat(m_FullFileName,&st_filestat);
m_FileSize=st_filestat.st_size;
struct tm nowtimer;
if (strcmp(m_DateFMT,"yyyy-mm-dd hh24:mi:ss") == 0)
{
nowtimer = *localtime(&st_filestat.st_mtime); nowtimer.tm_mon++;
snprintf(m_ModifyTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_ctime); nowtimer.tm_mon++;
snprintf(m_CreateTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_atime); nowtimer.tm_mon++;
snprintf(m_AccessTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
}
if (strcmp(m_DateFMT,"yyyymmddhh24miss") == 0)
{
nowtimer = *localtime(&st_filestat.st_mtime); nowtimer.tm_mon++;
snprintf(m_ModifyTime,20,"%04u%02u%02u%02u%02u%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_ctime); nowtimer.tm_mon++;
snprintf(m_CreateTime,20,"%04u%02u%02u%02u%02u%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_atime); nowtimer.tm_mon++;
snprintf(m_AccessTime,20,"%04u%02u%02u%02u%02u%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
}
m_uPOS++;
return true;
}
CDir::~CDir()
{
m_vFileName.clear();
}
void UpdateStr(char *in_string,const char *in_str1,const char *in_str2,bool bLoop)
{
if (in_string == 0) return;
if (strlen(in_string) == 0) return;
char strTemp[2048];
char *strStart=in_string;
char *strPos=0;
while (true)
{
if (strlen(in_string) >2000) break;
if (bLoop == true)
{
strPos=strstr(in_string,in_str1);
}
else
{
strPos=strstr(strStart,in_str1);
}
if (strPos == 0) break;
memset(strTemp,0,sizeof(strTemp));
strncpy(strTemp,in_string,strPos-in_string);
strcat(strTemp,in_str2);
strcat(strTemp,strPos+strlen(in_str1));
strcpy(in_string,strTemp);
strStart=strPos+strlen(in_str2);
}
}
bool REMOVE(const char *in_filename,const int in_times)
{
if (access(in_filename,R_OK) != 0) return false;
for (int ii=0;ii<in_times;ii++)
{
if (remove(in_filename) == 0) return true;
usleep(100000);
}
return false;
}
bool RENAME(const char *in_srcfilename,const char *in_dstfilename,const int in_times)
{
if (access(in_srcfilename,R_OK) != 0) return false;
if (MKDIR(in_dstfilename) == false) return false;
for (int ii=0;ii<in_times;ii++)
{
if (rename(in_srcfilename,in_dstfilename) == 0) return true;
usleep(100000);
}
return false;
}
CTcpClient::CTcpClient()
{
m_sockfd=-1;
memset(m_ip,0,sizeof(m_ip));
m_port=0;
m_btimeout=false;
}
bool CTcpClient::ConnectToServer(const char *ip,const int port)
{
if (m_sockfd != -1) { close(m_sockfd); m_sockfd = -1; }
strcpy(m_ip,ip);
m_port=port;
struct hostent* h;
struct sockaddr_in servaddr;
if ( (m_sockfd = socket(AF_INET,SOCK_STREAM,0) ) < 0) return false;
if ( !(h = gethostbyname(m_ip)) )
{
close(m_sockfd); m_sockfd = -1; return false;
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(m_port);
memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);
if (connect(m_sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0)
{
close(m_sockfd); m_sockfd = -1; return false;
}
return true;
}
bool CTcpClient::Read(char *buffer,const int itimeout)
{
if (m_sockfd == -1) return false;
if (itimeout>0)
{
fd_set tmpfd;
FD_ZERO(&tmpfd);
FD_SET(m_sockfd,&tmpfd);
struct timeval timeout;
timeout.tv_sec = itimeout; timeout.tv_usec = 0;
m_btimeout = false;
int i;
if ( (i = select(m_sockfd+1,&tmpfd,0,0,&timeout)) <= 0 )
{
if (i==0) m_btimeout = true;
return false;
}
}
m_buflen = 0;
return (TcpRead(m_sockfd,buffer,&m_buflen));
}
bool CTcpClient::Write(const char *buffer,const int ibuflen)
{
if (m_sockfd == -1) return false;
fd_set tmpfd;
FD_ZERO(&tmpfd);
FD_SET(m_sockfd,&tmpfd);
struct timeval timeout;
timeout.tv_sec = 5; timeout.tv_usec = 0;
m_btimeout = false;
int i;
if ( (i=select(m_sockfd+1,0,&tmpfd,0,&timeout)) <= 0 )
{
if (i==0) m_btimeout = true;
return false;
}
int ilen=ibuflen;
if (ibuflen==0) ilen=strlen(buffer);
return(TcpWrite(m_sockfd,buffer,ilen));
}
void CTcpClient::Close()
{
if (m_sockfd > 0) close(m_sockfd);
m_sockfd=-1;
memset(m_ip,0,sizeof(m_ip));
m_port=0;
m_btimeout=false;
}
CTcpClient::~CTcpClient()
{
Close();
}
CTcpServer::CTcpServer()
{
m_listenfd=-1;
m_connfd=-1;
m_socklen=0;
m_btimeout=false;
}
bool CTcpServer::InitServer(const unsigned int port)
{
if (m_listenfd > 0) { close(m_listenfd); m_listenfd=-1; }
m_listenfd = socket(AF_INET,SOCK_STREAM,0);
int opt = 1; unsigned int len = sizeof(opt);
setsockopt(m_listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,len);
setsockopt(m_listenfd,SOL_SOCKET,SO_KEEPALIVE,&opt,len);
memset(&m_servaddr,0,sizeof(m_servaddr));
m_servaddr.sin_family = AF_INET;
m_servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
m_servaddr.sin_port = htons(port);
if (bind(m_listenfd,(struct sockaddr *)&m_servaddr,sizeof(m_servaddr)) != 0 )
{
CloseListen(); return false;
}
if (listen(m_listenfd,5) != 0 )
{
CloseListen(); return false;
}
m_socklen = sizeof(struct sockaddr_in);
return true;
}
bool CTcpServer::Accept()
{
if (m_listenfd == -1) return false;
if ((m_connfd=accept(m_listenfd,(struct sockaddr *)&m_clientaddr,(socklen_t*)&m_socklen)) < 0)
return false;
return true;
}
char *CTcpServer::GetIP()
{
return(inet_ntoa(m_clientaddr.sin_addr));
}
bool CTcpServer::Read(char *buffer,const int itimeout)
{
if (m_connfd == -1) return false;
if (itimeout>0)
{
fd_set tmpfd;
FD_ZERO(&tmpfd);
FD_SET(m_connfd,&tmpfd);
struct timeval timeout;
timeout.tv_sec = itimeout; timeout.tv_usec = 0;
m_btimeout = false;
int i;
if ( (i = select(m_connfd+1,&tmpfd,0,0,&timeout)) <= 0 )
{
if (i==0) m_btimeout = true;
return false;
}
}
m_buflen = 0;
return(TcpRead(m_connfd,buffer,&m_buflen));
}
bool CTcpServer::Write(const char *buffer,const int ibuflen)
{
if (m_connfd == -1) return false;
fd_set tmpfd;
FD_ZERO(&tmpfd);
FD_SET(m_connfd,&tmpfd);
struct timeval timeout;
timeout.tv_sec = 5; timeout.tv_usec = 0;
m_btimeout = false;
int i;
if ( (i=select(m_connfd+1,0,&tmpfd,0,&timeout)) <= 0 )
{
if (i==0) m_btimeout = true;
return false;
}
int ilen = ibuflen;
if (ilen==0) strlen(buffer);
return(TcpWrite(m_connfd,buffer,ilen));
}
void CTcpServer::CloseListen()
{
if (m_listenfd > 0)
{
close(m_listenfd); m_listenfd=-1;
}
}
void CTcpServer::CloseClient()
{
if (m_connfd > 0)
{
close(m_connfd); m_connfd=-1;
}
}
CTcpServer::~CTcpServer()
{
CloseListen(); CloseClient();
}
bool TcpRead(const int sockfd,char *buffer,int *ibuflen,const int itimeout)
{
if (sockfd == -1) return false;
if (itimeout > 0)
{
fd_set tmpfd;
FD_ZERO(&tmpfd);
FD_SET(sockfd,&tmpfd);
struct timeval timeout;
timeout.tv_sec = itimeout; timeout.tv_usec = 0;
int i;
if ( (i = select(sockfd+1,&tmpfd,0,0,&timeout)) <= 0 ) return false;
}
(*ibuflen) = 0;
if (Readn(sockfd,(char*)ibuflen,4) == false) return false;
if (Readn(sockfd,buffer,(*ibuflen)) == false) return false;
return true;
}
bool TcpWrite(const int sockfd,const char *buffer,const int ibuflen)
{
if (sockfd == -1) return false;
fd_set tmpfd;
FD_ZERO(&tmpfd);
FD_SET(sockfd,&tmpfd);
struct timeval timeout;
timeout.tv_sec = 5; timeout.tv_usec = 0;
if ( select(sockfd+1,0,&tmpfd,0,&timeout) <= 0 ) return false;
int ilen=0;
if (ibuflen==0) ilen=strlen(buffer);
else ilen=ibuflen;
char strTBuffer[ilen+4];
memset(strTBuffer,0,sizeof(strTBuffer));
memcpy(strTBuffer,&ilen,4);
memcpy(strTBuffer+4,buffer,ilen);
if (Writen(sockfd,strTBuffer,ilen+4) == false) return false;
return true;
}
bool Readn(const int sockfd,char *buffer,const size_t n)
{
int nLeft,nread,idx;
nLeft = n;
idx = 0;
while(nLeft > 0)
{
if ( (nread = recv(sockfd,buffer + idx,nLeft,0)) <= 0) return false;
idx += nread;
nLeft -= nread;
}
return true;
}
bool Writen(const int sockfd,const char *buffer,const size_t n)
{
int nLeft,idx,nwritten;
nLeft = n;
idx = 0;
while(nLeft > 0 )
{
if ( (nwritten = send(sockfd, buffer + idx,nLeft,0)) <= 0) return false;
nLeft -= nwritten;
idx += nwritten;
}
return true;
}
bool SendFile(int sockfd,struct st_fileinfo *stfileinfo,CLogFile *logfile)
{
char strSendBuffer[301],strRecvBuffer[301];
memset(strSendBuffer,0,sizeof(strSendBuffer));
snprintf(strSendBuffer,300,"<filename>%s</filename><filesize>%d</filesize><mtime>%s</mtime>",stfileinfo->filename,stfileinfo->filesize,stfileinfo->mtime);
if (TcpWrite(sockfd,strSendBuffer) == false)
{
if (logfile!=0) logfile->Write("SendFile TcpWrite() failed.\n");
return false;
}
int bytes=0;
int total_bytes=0;
int onread=0;
char buffer[1000];
FILE *fp=0;
if ( (fp=FOPEN(stfileinfo->filename,"rb")) == 0 )
{
if (logfile!=0) logfile->Write("SendFile FOPEN(%s) failed.\n",stfileinfo->filename);
return false;
}
while (true)
{
memset(buffer,0,sizeof(buffer));
if ((stfileinfo->filesize-total_bytes) > 1000) onread=1000;
else onread=stfileinfo->filesize-total_bytes;
bytes=fread(buffer,1,onread,fp);
if (bytes > 0)
{
if (Writen(sockfd,buffer,bytes) == false)
{
if (logfile!=0) logfile->Write("SendFile Writen() failed.\n");
fclose(fp); fp=0; return false;
}
}
total_bytes = total_bytes + bytes;
if ((int)total_bytes == stfileinfo->filesize) break;
}
fclose(fp);
int buflen=0;
memset(strRecvBuffer,0,sizeof(strRecvBuffer));
if (TcpRead(sockfd,strRecvBuffer,&buflen)==false)
{
if (logfile!=0) logfile->Write("SendFile TcpRead() failed.\n");
return false;
}
if (strcmp(strRecvBuffer,"ok")!=0) return false;
return true;
}
bool RecvFile(int sockfd,struct st_fileinfo *stfileinfo,CLogFile *logfile)
{
char strSendBuffer[301],strRecvBuffer[301];
char strfilenametmp[301]; memset(strfilenametmp,0,sizeof(strfilenametmp));
sprintf(strfilenametmp,"%s.tmp",stfileinfo->filename);
FILE *fp=0;
if ( (fp=FOPEN(strfilenametmp,"wb")) ==0)
{
if (logfile!=0) logfile->Write("RecvFile FOPEN %s failed.\n",strfilenametmp);
return false;
}
int total_bytes=0;
int onread=0;
char buffer[1000];
while (true)
{
memset(buffer,0,sizeof(buffer));
if ((stfileinfo->filesize-total_bytes) > 1000) onread=1000;
else onread=stfileinfo->filesize-total_bytes;
if (Readn(sockfd,buffer,onread) == false)
{
if (logfile!=0) logfile->Write("RecvFile Readn() failed.\n");
fclose(fp); fp=0; return false;
}
fwrite(buffer,1,onread,fp);
total_bytes = total_bytes + onread;
if ((int)total_bytes == stfileinfo->filesize) break;
}
fclose(fp);
UTime(strfilenametmp,stfileinfo->mtime);
memset(strSendBuffer,0,sizeof(strSendBuffer));
if (RENAME(strfilenametmp,stfileinfo->filename)==true) strcpy(strSendBuffer,"ok");
else strcpy(strSendBuffer,"failed");
if (TcpWrite(sockfd,strSendBuffer)==false)
{
if (logfile!=0) logfile->Write("RecvFile TcpWrite() failed.\n");
return false;
}
if (strcmp(strSendBuffer,"ok") != 0) return false;
return true;
}
bool COPY(const char *srcfilename,const char *dstfilename)
{
if (MKDIR(dstfilename) == false) return false;
char strdstfilenametmp[301];
memset(strdstfilenametmp,0,sizeof(strdstfilenametmp));
snprintf(strdstfilenametmp,300,"%s.tmp",dstfilename);
int srcfd,dstfd;
srcfd=dstfd=-1;
int iFileSize=FileSize(srcfilename);
int bytes=0;
int total_bytes=0;
int onread=0;
char buffer[5000];
if ( (srcfd=open(srcfilename,O_RDONLY)) < 0 ) return false;
if ( (dstfd=open(strdstfilenametmp,O_WRONLY|O_CREAT|O_TRUNC,S_IWUSR|S_IRUSR|S_IXUSR)) < 0) { close(srcfd); return false; }
while (true)
{
memset(buffer,0,sizeof(buffer));
if ((iFileSize-total_bytes) > 5000) onread=5000;
else onread=iFileSize-total_bytes;
bytes=read(srcfd,buffer,onread);
if (bytes > 0) write(dstfd,buffer,bytes);
total_bytes = total_bytes + bytes;
if (total_bytes == iFileSize) break;
}
close(srcfd);
close(dstfd);
char strmtime[21];
memset(strmtime,0,sizeof(strmtime));
FileMTime(srcfilename,strmtime);
UTime(strdstfilenametmp,strmtime);
if (RENAME(strdstfilenametmp,dstfilename) == false) { REMOVE(strdstfilenametmp); return false; }
return true;
}
CTimer::CTimer()
{
memset(&m_start,0,sizeof(struct timeval));
memset(&m_end,0,sizeof(struct timeval));
Start();
}
void CTimer::Start()
{
gettimeofday( &m_start, NULL );
}
double CTimer::Elapsed()
{
gettimeofday( &m_end, NULL );
double dstart,dend;
dstart=dend=0;
char strtemp[51];
memset(strtemp,0,sizeof(strtemp));
snprintf(strtemp,30,"%ld.%ld",m_start.tv_sec,m_start.tv_usec);
dstart=atof(strtemp);
memset(strtemp,0,sizeof(strtemp));
snprintf(strtemp,30,"%ld.%ld",m_end.tv_sec,m_end.tv_usec);
dend=atof(strtemp);
Start();
return dend-dstart;
}
3._cmpublic.h
#ifndef _cmpublic_H
#define _cmpublic_H
#include <stdio.h>
#include <utime.h>
#include <string.h>
#include <strings.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <time.h>
#include <math.h>
#include <stdarg.h>
#include <errno.h>
#include <signal.h>
#include <netdb.h>
#include <locale.h>
#include <dirent.h>
#include <termios.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iconv.h>
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <list>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
#ifndef BOOL
#define BOOL unsigned char
#endif
#ifndef bool
#define bool unsigned char
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef true
#define true 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef false
#define false 0
#endif
#ifndef INT
#define INT long
#endif
#ifndef UINT
#define UINT unsigned long
#endif
#ifndef UCHAR
#define UCHAR unsigned long
#endif
#endif
