www.pudn.com > NETINFO.rar > UserFunc.h
///////////////////////////////////////////////////////////////////////////////////////////
//---------------------- base user connection class begin ---------------------------------
class CUserConnection
{
public:
CUserConnection(HNETINFO hNi, const TCP_ADDR* connecter, const TCP_ADDR* listener);
virtual ~CUserConnection();
virtual void OnTcpData(HNETINFO hNi, HTCPCONNECT hConnect, BOOL bConnecterToListener,
const BYTE*pData, DWORD length){};
protected:
HNETINFO m_hNi;
TCP_ADDR m_connecter;
TCP_ADDR m_listener;
};
CUserConnection::CUserConnection(HNETINFO hNi, const TCP_ADDR* connecter, const TCP_ADDR* listener)
:m_hNi(hNi), m_connecter(*connecter), m_listener(*listener)
{
}
CUserConnection::~CUserConnection()
{
}
/*------------------------debug begin-----------------------------------
void CUserConnection::OnTcpData(HNETINFO hNi, HTCPCONNECT hConnect,
BOOL bConnecterToListener, const BYTE*pData, DWORD length)
{
char buffer[64000];
if( length < sizeof(buffer) )
{
memcpy(buffer, pData, length);
buffer[length] = 0;
for(char *p1 = buffer; p1-buffer<(int)length; p1 = p1 + strlen(p1) + 1 )
{
strlwr(p1);
if( strstr(p1, "post") )
{
BreakDownConnect(hConnect);
printf("%d.%d.%d.%d:%d --> %d.%d.%d.%d:%d breaking......\n",
m_connecter.ip.b1, m_connecter.ip.b2, m_connecter.ip.b3, m_connecter.ip.b4, m_connecter.port,
m_listener.ip.b1, m_listener.ip.b2, m_listener.ip.b3, m_listener.ip.b4, m_listener.port);
break;
}
}
}
}
-----------------------debug end--------------------------------------*/
//---------------------- base user connection class end ---------------------------------
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
//---------------------- dump to txt file user connection class begin --------------------
class CUserDumpConnection:public CUserConnection
{
public:
CUserDumpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char szDumpDir[]);
virtual ~CUserDumpConnection();
virtual void OnTcpData(HNETINFO hNi, HTCPCONNECT hConnect, BOOL bConnecterToListener,
const BYTE*pData, DWORD length);
protected:
char m_szFileName[MAX_PATH];
FILE *m_fp;
};
CUserDumpConnection::CUserDumpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char szDumpDir[])
:CUserConnection(hNi, connecter, listener)
{
char szFileName[MAX_PATH];
GetConnectionTempFileName(connecter, listener, szFileName);
sprintf(m_szFileName, "%s%s", szDumpDir, szFileName);
m_fp = fopen(m_szFileName, "wb");
}
CUserDumpConnection::~CUserDumpConnection()
{
if( m_fp )
fclose(m_fp);
DeleteEmptyFile(m_szFileName);
}
void CUserDumpConnection::OnTcpData(HNETINFO hNi, HTCPCONNECT hConnect, BOOL bConnecterToListener,
const BYTE*pData, DWORD length)
{
if( m_fp )
{
char title[MAX_PATH];
if( bConnecterToListener )
sprintf(title, "%lu;Sender=Connecter;<<<<<<<<<<------=------>>>>>>>>>>\r\n", length);
else
sprintf(title, "%lu;Sender=Listener;<<<<<<<<<<------=------>>>>>>>>>>\r\n", length);
fwrite(title, 1, strlen(title), m_fp);
fwrite(pData, 1, length, m_fp);
fwrite("\r\n", 1, 2, m_fp);
}
}
//---------------------- dump to txt file connection class end ---------------------------
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
//---------------------- ftp user connection class begin ---------------------------------
class CUserFtpConnection: public CUserConnection
{
public:
CUserFtpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char *szFtpDir);
virtual ~CUserFtpConnection();
void OnFtpCommand(HNETINFO hNi, HFTPCONNECT hFtpConnect, const char* szCommand);
void OnFtpReply(HNETINFO hNi, HFTPCONNECT hFtpConnect,
const char* szCommand, const char* szReply);
void OnFtpFileTransferBegin(HNETINFO hNi, HFTPCONNECT hFtpConnect, DWORD dwStartPos,
BOOL bClientToServer, const char* szFullUnixFilePath);
void OnFtpFileData(HNETINFO hNi, HFTPCONNECT hFtpConnect,
const BYTE*pData, DWORD length);
void OnFtpFileTransferEnd(HNETINFO hNi, HFTPCONNECT hFtpConnect);
protected:
void CloseFile();
protected:
char m_szFtpDir[MAX_PATH];
char m_szFilePath[MAX_PATH];
FILE *m_fp;
};
CUserFtpConnection::CUserFtpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char *szFtpDir)
:CUserConnection(hNi, connecter, listener)
{
strcpy(m_szFtpDir, szFtpDir);
strcpy(m_szFilePath, "");
m_fp = NULL;
}
CUserFtpConnection::~CUserFtpConnection()
{
CloseFile();
}
void CUserFtpConnection::CloseFile()
{
if( m_fp )
{
fclose(m_fp);
m_fp = NULL;
DeleteEmptyFile(m_szFilePath);
strcpy(m_szFilePath, "");
}
}
void CUserFtpConnection::OnFtpCommand(HNETINFO hNi, HFTPCONNECT hFtpConnect, const char* szCommand)
{
}
void CUserFtpConnection::OnFtpReply(HNETINFO hNi, HFTPCONNECT hFtpConnect,
const char* szCommand, const char* szReply)
{
}
void CUserFtpConnection::OnFtpFileTransferBegin(HNETINFO hNi, HFTPCONNECT hFtpConnect, DWORD dwStartPos,
BOOL bClientToServer, const char* szFullUnixFilePath)
{
CloseFile();
char *mode = bClientToServer ? "put" : "get";
char szTemp[MAX_PATH];
sprintf(szTemp, "%s%s\\%d.%d.%d.%d__%d.%d.%d.%d%s", m_szFtpDir, mode,
m_connecter.ip.b1, m_connecter.ip.b2, m_connecter.ip.b3, m_connecter.ip.b4,
m_listener.ip.b1, m_listener.ip.b2, m_listener.ip.b3, m_listener.ip.b4,
szFullUnixFilePath);
UnixPath2DosPath(szTemp, m_szFilePath);
CreateFilePath(m_szFilePath);
m_fp = fopen(m_szFilePath, "wb");
}
void CUserFtpConnection::OnFtpFileData(HNETINFO hNi, HFTPCONNECT hFtpConnect,
const BYTE*pData, DWORD length)
{
if( m_fp )
fwrite(pData, 1, length, m_fp);
}
void CUserFtpConnection::OnFtpFileTransferEnd(HNETINFO hNi, HFTPCONNECT hFtpConnect)
{
CloseFile();
}
//---------------------- ftp user connection class end -----------------------------------
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
//---------------------- http user connection class begin ---------------------------------
class CUserHttpConnection: public CUserConnection
{
public:
CUserHttpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char *szHttpDir);
virtual ~CUserHttpConnection();
void OnHttpClientBegin(HNETINFO hNi, HHTTPCONNECT hHttpConnect);
void OnHttpClientHeader(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const HTTP_HEADER_INFO* pClientHeader);
void OnHttpClientBody(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const BYTE* pData, DWORD length);
void OnHttpClientEnd(HNETINFO hNi, HHTTPCONNECT hHttpConnect);
void OnHttpServerBegin(HNETINFO hNi, HHTTPCONNECT hHttpConnect);
void OnHttpServerHeader(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const HTTP_HEADER_INFO* pClientHeader, const HTTP_HEADER_INFO* pServerHeader);
void OnHttpServerBody(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const BYTE* pData, DWORD length);
void OnHttpServerEnd(HNETINFO hNi, HHTTPCONNECT hHttpConnect);
private:
BOOL GetHttpFilePath(BOOL bClientToServer,
const HTTP_HEADER_INFO *pClient, const HTTP_HEADER_INFO *pServer,
const TCP_ADDR *listener, const TCP_ADDR *connecter,
const char szHttpDir[MAX_PATH], char szFilePath[MAX_PATH]);
void OpenHttpFile(HHTTPCONNECT hHttpConnect);
void CloseHttpFile();
void PreWriteRequestHttpHeader(const HTTP_HEADER_INFO* pHeader, FILE *fp);
private:
BOOL m_bClientToServer;
BOOL m_bHasTryToCreateFile;
char m_szHttpDir[MAX_PATH];
char m_szFilePath[MAX_PATH];
FILE *m_fp;
};
CUserHttpConnection::CUserHttpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char *szHttpDir)
:CUserConnection(hNi, connecter, listener)
{
m_bClientToServer = TRUE;
m_bHasTryToCreateFile = FALSE;
strcpy(m_szHttpDir, szHttpDir);
strcpy(m_szFilePath, "");
m_fp = NULL;
}
CUserHttpConnection::~CUserHttpConnection()
{
CloseHttpFile();
}
BOOL CUserHttpConnection::GetHttpFilePath(BOOL bClientToServer,
const HTTP_HEADER_INFO *pClient, const HTTP_HEADER_INFO *pServer,
const TCP_ADDR *listener, const TCP_ADDR *connecter,
const char szHttpDir[MAX_PATH], char szFilePath[MAX_PATH])
{
BOOL result = FALSE;
//request message body
if( bClientToServer )
{
char host[MAX_HOST_LENGTH];
strcpy(host, "");
//get host from m_request.host
if( stricmp(host,"")==0 )
strcpy(host, pClient->host);
//get host from url if url has host infomation
if( stricmp(host, "")==0 )
GetHostFromUrl(pClient->url, host);
//get host from dest ip
if( stricmp(host, "")==0 )
sprintf(host, "%d.%d.%d.%d", listener->ip.b1, listener->ip.b2, listener->ip.b3, listener->ip.b4);
//get filename
SYSTEMTIME lt;
GetLocalTime(<);
sprintf(szFilePath, "%s%04d%02d%02d_%02d%02d%02d_%03d_%d__%d_%d_%d_%d__%s.txt", szHttpDir,
lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond, lt.wMilliseconds, rand(),
connecter->ip.b1, connecter->ip.b2, connecter->ip.b3, connecter->ip.b4,
host);
result = TRUE;
}
//response message body
else
{
if( strcmp(pServer->status_Code, "200")!=0 )
return FALSE;
char host[MAX_HOST_LENGTH], url[MAX_URL_LENGTH];
strcpy(host, pClient->host);
strcpy(url, pClient->url);
//make host non-empty
//get host from response.host if it's non-empty
if( strcmp(host, "") == 0 )
{
strcpy(host, pClient->host);
}
//get host from request.url if it's abs-url
if( strcmp(host, "") == 0 )
{
GetHostFromUrl(url, host);
}
//make host from ip address
if( strcmp(host, "") == 0 )
{
sprintf(host, "%d.%d.%d.%d",
listener->ip.b1, listener->ip.b2, listener->ip.b3, listener->ip.b4);
}
//get source ip address in string
char szSrcIpStr[30];
sprintf(szSrcIpStr, "%d.%d.%d.%d",
connecter->ip.b1, connecter->ip.b2, connecter->ip.b3, connecter->ip.b4);
//make url abs-path
if( url[0]!='/' && strstr(url, "://") )
{
char *pStart, *pEnd;
pStart = strstr(url, "://");
pStart += 3;
pEnd = strchr(pStart, '/');
if( pEnd )
{
memmove(url, pEnd, strlen(pEnd)+1);
}
else
{
strcpy(url, "/index.htm");
}
}
//search URL for '?'
char *pQuestion = strchr(url, '?');
//filename can be got from url
if( !pQuestion )
{
//url hasn't filename, we must add a filename to it
if( url[strlen(url)-1] == '/' )
strcat(url, "index.htm");
//make filename
char unixPath[MAX_PATH];
sprintf(unixPath, "%s%s__%s%s", szHttpDir, szSrcIpStr, host, url);
UnixPath2DosPath(unixPath, szFilePath);
result = TRUE;
}
//filename can only be got from content-type
else
{
char *pChar;
//look for the last '/' in url( now it's abs-path )
//make url abs-path without filename and '?'
for(pChar = pQuestion; pChar>=url && *pChar!='/'; pChar--)NULL;
pChar++;
*pChar = 0;
//get extension of filename
char unixPath[MAX_PATH], ext[MAX_PATH];
GetExtFromMimeType(pServer->content_MainType, pServer->content_SubType, ext);
//get filename
SYSTEMTIME lst;
GetLocalTime(&lst);
char pureName[MAX_PATH];
sprintf(pureName, "%4d%02d%02d_%02d%02d%02d_%d",
lst.wYear, lst.wMonth, lst.wDay, lst.wHour, lst.wMinute, lst.wSecond, rand() );
sprintf(unixPath, "%s%s__%s%s%s.%s", szHttpDir, szSrcIpStr, host,
url, pureName, ext);
UnixPath2DosPath(unixPath, szFilePath);
result = TRUE;
}
}
return result;
}
void CUserHttpConnection::PreWriteRequestHttpHeader(const HTTP_HEADER_INFO* pHeader, FILE *fp)
{
fprintf(fp, "%s %s %s\r\n", pHeader->method, pHeader->url, pHeader->http_Version);
if( strcmp(pHeader->host, "")!=0 )
fprintf(fp, "Host: %s\r\n", pHeader->host);
if( strcmp(pHeader->content_Encoding, "")!=0 )
fprintf(fp, "Content-Encoding: %s\r\n", pHeader->content_Encoding);
if( strcmp(pHeader->content_Length, "")!=0 )
fprintf(fp, "Content-Length: %s\r\n", pHeader->content_Length);
if( strcmp(pHeader->content_MainType, "")!=0 )
fprintf(fp, "Content-Type: %s/%s\r\n", pHeader->content_MainType, pHeader->content_SubType);
if( strcmp(pHeader->content_Range, "")!=0 )
fprintf(fp, "Content_Range: %s\r\n", pHeader->content_Range);
if( strcmp(pHeader->referer, "")!=0 )
fprintf(fp, "Referer: %s\r\n", pHeader->referer);
if( strcmp(pHeader->transfer_Encoding, "")!=0 )
fprintf(fp, "Transfer_Encoding: %s\r\n", pHeader->transfer_Encoding);
if( strcmp(pHeader->connection, "")!=0 )
fprintf(fp, "Connection: %s\r\n", pHeader->connection);
fprintf(fp, "\r\n");
}
void CUserHttpConnection::OpenHttpFile(HHTTPCONNECT hHttpConnect)
{
const HTTP_HEADER_INFO *pClient, *pServer;
GetHttpHeader(hHttpConnect, &pClient, &pServer);
if( GetHttpFilePath(m_bClientToServer, pClient, pServer,
&m_listener, &m_connecter, m_szHttpDir, m_szFilePath) )
{
CreateFilePath(m_szFilePath);
m_fp = fopen(m_szFilePath, "wb");
if( m_fp && m_bClientToServer )
PreWriteRequestHttpHeader(pClient, m_fp);
}
}
void CUserHttpConnection::CloseHttpFile()
{
if( m_fp )
{
fclose(m_fp);
m_fp = NULL;
DeleteEmptyFile(m_szFilePath);
}
}
void CUserHttpConnection::OnHttpClientBegin(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CloseHttpFile();
m_bClientToServer = TRUE;
m_bHasTryToCreateFile = FALSE;
}
void CUserHttpConnection::OnHttpClientHeader(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const HTTP_HEADER_INFO* pClientHeader)
{
}
void CUserHttpConnection::OnHttpClientBody(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const BYTE* pData, DWORD length)
{
if( !m_fp && !m_bHasTryToCreateFile )
{
OpenHttpFile(hHttpConnect);
m_bHasTryToCreateFile = TRUE;
}
if( m_fp )
fwrite(pData, 1, length, m_fp);
}
void CUserHttpConnection::OnHttpClientEnd(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CloseHttpFile();
}
void CUserHttpConnection::OnHttpServerBegin(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CloseHttpFile();
m_bClientToServer = FALSE;
m_bHasTryToCreateFile = FALSE;
}
void CUserHttpConnection::OnHttpServerHeader(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const HTTP_HEADER_INFO* pClientHeader, const HTTP_HEADER_INFO* pServerHeader)
{
}
void CUserHttpConnection::OnHttpServerBody(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const BYTE* pData, DWORD length)
{
if( !m_fp && !m_bHasTryToCreateFile )
{
OpenHttpFile(hHttpConnect);
m_bHasTryToCreateFile = TRUE;
}
if( m_fp )
fwrite(pData, 1, length, m_fp);
}
void CUserHttpConnection::OnHttpServerEnd(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CloseHttpFile();
}
//---------------------- http user connection class end -----------------------------------
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
//---------------------- smtp user connection class begin ---------------------------------
class CUserSmtpConnection:public CUserConnection
{
public:
CUserSmtpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char* szSmtpDir);
virtual ~CUserSmtpConnection();
void OnSmtpCommand(HNETINFO hNi, HSMTPCONNECT hSmtpConnect, const char* szCommand);
void OnSmtpReply(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* szCommand, const char* szReply);
void OnSmtpMessageTransferBegin(HNETINFO hNi, HSMTPCONNECT hSmtpConnect);
void OnSmtpMessageHeader(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* from, const char* to, const char* subject);
void OnSmtpMessageEntityHeader(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* mimeMainType, const char* mimeSubType,
const char* filename);
void OnSmtpMessageEntityBody(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const BYTE* pData, DWORD length);
void OnSmtpMessageEntityBodyEnd(HNETINFO hNi, HSMTPCONNECT hSmtpConnect);
void OnSmtpMessageTransferEnd(HNETINFO hNi, HSMTPCONNECT hSmtpConnect);
private:
void CloseFile();
private:
char m_szSmtpDir[MAX_PATH];
char m_szMessageDir[MAX_PATH];
char m_szFilePath[MAX_PATH];
FILE *m_fp;
};
CUserSmtpConnection::CUserSmtpConnection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char* szSmtpDir)
:CUserConnection(hNi, connecter, listener)
{
strcpy(m_szSmtpDir, szSmtpDir);
strcpy(m_szMessageDir, "");
strcpy(m_szFilePath, "");
m_fp = NULL;
}
void CUserSmtpConnection::CloseFile()
{
if( m_fp )
{
fclose(m_fp);
m_fp = NULL;
}
strcpy(m_szFilePath, "");
}
CUserSmtpConnection::~CUserSmtpConnection()
{
CloseFile();
}
void CUserSmtpConnection::OnSmtpCommand(HNETINFO hNi, HSMTPCONNECT hSmtpConnect, const char* szCommand)
{
}
void CUserSmtpConnection::OnSmtpReply(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* szCommand, const char* szReply)
{
}
void CUserSmtpConnection::OnSmtpMessageTransferBegin(HNETINFO hNi, HSMTPCONNECT hSmtpConnect)
{
SYSTEMTIME lt;
GetLocalTime(<);
sprintf(m_szMessageDir, "%04d%02d%02d_%02d%02d%02d_%04d_%d__%d_%d_%d_%d_%d__%d_%d_%d_%d_%d",
lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond, lt.wMilliseconds, rand(),
m_connecter.ip.b1, m_connecter.ip.b2, m_connecter.ip.b3, m_connecter.ip.b4, m_connecter.port,
m_listener.ip.b1, m_listener.ip.b2, m_listener.ip.b3, m_listener.ip.b4, m_listener.port);
}
void CUserSmtpConnection::OnSmtpMessageHeader(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* from, const char* to, const char* subject)
{
char filename[MAX_PATH];
sprintf(filename, "%s%s\\header%d.txt", m_szSmtpDir, m_szMessageDir, rand() );
CreateFilePath(filename);
FILE* fp = fopen(filename, "wt");
if( fp )
{
fprintf(fp, "From: %s\n", from);
fprintf(fp, "To: %s\n", to);
fprintf(fp, "Subject: %s\n", subject);
fclose(fp);
}
}
void CUserSmtpConnection::OnSmtpMessageEntityHeader(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* mimeMainType, const char* mimeSubType,
const char* filename)
{
CloseFile();
sprintf(m_szFilePath, "%s%s\\%s", m_szSmtpDir, m_szMessageDir, filename);
CreateFilePath(m_szFilePath);
m_fp = fopen(m_szFilePath, "wb");
}
void CUserSmtpConnection::OnSmtpMessageEntityBody(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const BYTE* pData, DWORD length)
{
if( m_fp )
fwrite(pData, 1, length, m_fp);
}
void CUserSmtpConnection::OnSmtpMessageEntityBodyEnd(HNETINFO hNi, HSMTPCONNECT hSmtpConnect)
{
CloseFile();
}
void CUserSmtpConnection::OnSmtpMessageTransferEnd(HNETINFO hNi, HSMTPCONNECT hSmtpConnect)
{
strcpy(m_szMessageDir, "");
}
//---------------------- smtp user connection class end -----------------------------------
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
//---------------------- smtp user connection class begin ---------------------------------
class CUserPop3Connection:public CUserConnection
{
public:
CUserPop3Connection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char* szPop3Dir);
virtual ~CUserPop3Connection();
void OnPop3Command(HNETINFO hNi, HPOP3CONNECT hPop3Connect, const char* szCommand);
void OnPop3Reply(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* szCommand, const char* szReply);
void OnPop3MessageTransferBegin(HNETINFO hNi, HPOP3CONNECT hPop3Connect);
void OnPop3MessageHeader(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* from, const char* to, const char* subject);
void OnPop3MessageEntityHeader(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* mimeMainType, const char* mimeSubType,
const char* filename);
void OnPop3MessageEntityBody(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const BYTE* pData, DWORD length);
void OnPop3MessageEntityBodyEnd(HNETINFO hNi, HPOP3CONNECT hPop3Connect);
void OnPop3MessageTransferEnd(HNETINFO hNi, HPOP3CONNECT hPop3Connect);
private:
void CloseFile();
private:
char m_szPop3Dir[MAX_PATH];
char m_szMessageDir[MAX_PATH];
char m_szFilePath[MAX_PATH];
FILE *m_fp;
};
CUserPop3Connection::CUserPop3Connection(HNETINFO hNi, const TCP_ADDR* connecter,
const TCP_ADDR* listener, const char* szPop3Dir)
:CUserConnection(hNi, connecter, listener)
{
strcpy(m_szPop3Dir, szPop3Dir);
strcpy(m_szMessageDir, "");
strcpy(m_szFilePath, "");
m_fp = NULL;
}
void CUserPop3Connection::CloseFile()
{
if( m_fp )
{
fclose(m_fp);
m_fp = NULL;
}
strcpy(m_szFilePath, "");
}
CUserPop3Connection::~CUserPop3Connection()
{
CloseFile();
}
void CUserPop3Connection::OnPop3Command(HNETINFO hNi, HPOP3CONNECT hPop3Connect, const char* szCommand)
{
}
void CUserPop3Connection::OnPop3Reply(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* szCommand, const char* szReply)
{
}
void CUserPop3Connection::OnPop3MessageTransferBegin(HNETINFO hNi, HPOP3CONNECT hPop3Connect)
{
SYSTEMTIME lt;
GetLocalTime(<);
sprintf(m_szMessageDir, "%04d%02d%02d_%02d%02d%02d_%04d_%d__%d_%d_%d_%d_%d__%d_%d_%d_%d_%d",
lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond, lt.wMilliseconds, rand(),
m_connecter.ip.b1, m_connecter.ip.b2, m_connecter.ip.b3, m_connecter.ip.b4, m_connecter.port,
m_listener.ip.b1, m_listener.ip.b2, m_listener.ip.b3, m_listener.ip.b4, m_listener.port);
}
void CUserPop3Connection::OnPop3MessageHeader(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* from, const char* to, const char* subject)
{
char filename[MAX_PATH];
sprintf(filename, "%s%s\\header%d.txt", m_szPop3Dir, m_szMessageDir, rand() );
CreateFilePath(filename);
FILE* fp = fopen(filename, "wt");
if( fp )
{
fprintf(fp, "From: %s\n", from);
fprintf(fp, "To: %s\n", to);
fprintf(fp, "Subject: %s\n", subject);
fclose(fp);
}
}
void CUserPop3Connection::OnPop3MessageEntityHeader(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* mimeMainType, const char* mimeSubType,
const char* filename)
{
CloseFile();
sprintf(m_szFilePath, "%s%s\\%s", m_szPop3Dir, m_szMessageDir, filename);
CreateFilePath(m_szFilePath);
m_fp = fopen(m_szFilePath, "wb");
}
void CUserPop3Connection::OnPop3MessageEntityBody(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const BYTE* pData, DWORD length)
{
if( m_fp )
fwrite(pData, 1, length, m_fp);
}
void CUserPop3Connection::OnPop3MessageEntityBodyEnd(HNETINFO hNi, HPOP3CONNECT hPop3Connect)
{
CloseFile();
}
void CUserPop3Connection::OnPop3MessageTransferEnd(HNETINFO hNi, HPOP3CONNECT hPop3Connect)
{
strcpy(m_szMessageDir, "");
}
//---------------------- smtp user connection class end -----------------------------------
///////////////////////////////////////////////////////////////////////////////////////////
//通知用户并由用户决定此连接是否打开,及其打开类型,返回TRUE表明打开, 返回FALSE表明不打开
BOOL OnOpenConnect(HNETINFO hNi, const TCP_ADDR* connecter, const TCP_ADDR* listener,
enum CONNECT_TYPE *retType, DWORD* pdwAttachData)
{
CUserConnection *pUserConnect = NULL;
BOOL retVal = FALSE;//The [retval] attribute designates the parameter that receives the return value of the member.
//return-type function-name([out, retval [, optional-attributes]] data-type * param-name, ...);
if( g_bSaveRawContent )//netinfo.cpp(31):BOOL g_bSaveRawContent = FALSE;
{
*retType = TCP_CONNECT;
if( g_wTcpListenPort == 0 )
{
retVal = TRUE;
pUserConnect = new CUserDumpConnection(hNi, connecter, listener, g_szTxtPrintDir);
}
else
{
if( listener->port == g_wTcpListenPort )
{
retVal = TRUE;
pUserConnect = new CUserDumpConnection(hNi, connecter, listener, g_szTxtPrintDir);
}
}
}
else if( g_bOnlyShow )
{
*retType = TCP_CONNECT;
retVal = TRUE;
pUserConnect = new CUserConnection(hNi, connecter, listener);
}
else
{
*retType = TCP_CONNECT;
retVal = TRUE;
if( listener->port == TCP_PORT_HTTP || listener->port == 3128 || listener->port == 8080 )
{
*retType = HTTP_CONNECT;
pUserConnect = new CUserHttpConnection(hNi, connecter, listener, g_szHttpDir);
}
else if( listener->port == TCP_PORT_FTP )
{
*retType = FTP_CONNECT;
pUserConnect = new CUserFtpConnection(hNi, connecter, listener, g_szFtpDir);
}
else if( listener->port == TCP_PORT_SMTP )
{
*retType = SMTP_CONNECT;
pUserConnect = new CUserSmtpConnection(hNi, connecter, listener, g_szSmtpDir);
}
else if( listener->port == TCP_PORT_POP3 )
{
*retType = POP3_CONNECT;
pUserConnect = new CUserPop3Connection(hNi, connecter, listener, g_szPop3Dir);
}
else if( g_bAllConnectionSaved )
pUserConnect = new CUserDumpConnection(hNi, connecter, listener, g_szTxtPrintDir);
else
pUserConnect = new CUserConnection(hNi, connecter, listener);
}
*pdwAttachData = (DWORD)pUserConnect;
return retVal;
}
//通知用户某连接将关闭
void OnCloseConnect(HNETINFO hNi, HTCPCONNECT hConnect)
{
CUserConnection *pUserConnect = (CUserConnection *)GetConnectAttachData((HTCPCONNECT)hConnect);
if( pUserConnect ) delete pUserConnect;
}
//通知用户某TCP连接有数据到达
void OnTcpDataStub(HNETINFO hNi, HTCPCONNECT hConnect, BOOL bConnecterToListener,
const BYTE*pData, DWORD length)
{
CUserConnection *pUserConnect = (CUserConnection *)GetConnectAttachData((HTCPCONNECT)hConnect);
if( pUserConnect ) pUserConnect->OnTcpData(hNi, hConnect, bConnecterToListener, pData, length);
}
//通知用户某ftp连接客户端已发出命令,此命令行尾部的CRLF已被去掉
void OnFtpCommandStub(HNETINFO hNi, HFTPCONNECT hFtpConnect, const char* szCommand)
{
CUserFtpConnection *pFtp = (CUserFtpConnection *)GetConnectAttachData((HTCPCONNECT)hFtpConnect);
if( pFtp ) pFtp->OnFtpCommand(hNi, hFtpConnect, szCommand);
}
//通知用户某ftp连接服务端已发出应答,此应答及对应的行尾部的CRLF已被去掉
void OnFtpReplyStub(HNETINFO hNi, HFTPCONNECT hFtpConnect,
const char* szCommand, const char* szReply)
{
CUserFtpConnection *pFtp = (CUserFtpConnection *)GetConnectAttachData((HTCPCONNECT)hFtpConnect);
if( pFtp ) pFtp->OnFtpReply(hNi, hFtpConnect, szCommand, szReply);
}
//通知用户某ftp连接已准备传送一个文件,
//参数szFullUnixFilePath已包含了'/'为目录分隔符的全路径
void OnFtpFileTransferBeginStub(HNETINFO hNi, HFTPCONNECT hFtpConnect, DWORD dwStartPos,
BOOL bClientToServer, const char* szFullUnixFilePath)
{
CUserFtpConnection *pFtp = (CUserFtpConnection *)GetConnectAttachData((HTCPCONNECT)hFtpConnect);
if( pFtp ) pFtp->OnFtpFileTransferBegin(hNi, hFtpConnect, dwStartPos,
bClientToServer, szFullUnixFilePath);
}
//通知用户某FTP连接的某文件有一段数据已被传输
void OnFtpFileDataStub(HNETINFO hNi, HFTPCONNECT hFtpConnect,
const BYTE*pData, DWORD length)
{
CUserFtpConnection *pFtp = (CUserFtpConnection *)GetConnectAttachData((HTCPCONNECT)hFtpConnect);
if( pFtp ) pFtp->OnFtpFileData(hNi, hFtpConnect, pData, length);
}
//通知用户某FTP连接的某文件已传输完毕
void OnFtpFileTransferEndStub(HNETINFO hNi, HFTPCONNECT hFtpConnect)
{
CUserFtpConnection *pFtp = (CUserFtpConnection *)GetConnectAttachData((HTCPCONNECT)hFtpConnect);
if( pFtp ) pFtp->OnFtpFileTransferEnd(hNi, hFtpConnect);
}
//通知用户某HTTP连接的客户端即将发消息
void OnHttpClientBeginStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpClientBegin(hNi, hHttpConnect);
}
//通知用户某HTTP连接的客户端发送的消息头
void OnHttpClientHeaderStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const HTTP_HEADER_INFO* pClientHeader)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpClientHeader(hNi, hHttpConnect, pClientHeader);
}
//通知用户某HTTP连接的客户端即将发送的已解码的消息体数据
void OnHttpClientBodyStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const BYTE* pData, DWORD length)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpClientBody(hNi, hHttpConnect, pData, length);
}
//通知用户某HTTP连接的客户端发送的消息体数据结束
void OnHttpClientEndStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpClientEnd(hNi, hHttpConnect);
}
//通知用户某HTTP连接的服务器端即将发消息
void OnHttpServerBeginStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpServerBegin(hNi, hHttpConnect);
}
//通知用户某HTTP连接的服务器端发送的消息头
void OnHttpServerHeaderStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const HTTP_HEADER_INFO* pClientHeader, const HTTP_HEADER_INFO* pServerHeader)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpServerHeader(hNi, hHttpConnect, pClientHeader, pServerHeader);
}
//通知用户某HTTP连接的服务器端发送的已解码的消息体数据
void OnHttpServerBodyStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect,
const BYTE* pData, DWORD length)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpServerBody(hNi, hHttpConnect, pData, length);
}
//通知用户某HTTP连接的服务器端发送的消息体数据结束
void OnHttpServerEndStub(HNETINFO hNi, HHTTPCONNECT hHttpConnect)
{
CUserHttpConnection *pHttp = (CUserHttpConnection*) GetConnectAttachData((HTCPCONNECT)hHttpConnect);
if( pHttp ) pHttp->OnHttpServerEnd(hNi, hHttpConnect);
}
void OnSmtpCommandStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect, const char* szCommand)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpCommand(hNi, hSmtpConnect, szCommand);
}
void OnSmtpReplyStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* szCommand, const char* szReply)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpReply(hNi, hSmtpConnect, szCommand, szReply);
}
void OnSmtpMessageTransferBeginStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpMessageTransferBegin(hNi, hSmtpConnect);
}
void OnSmtpMessageHeaderStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* from, const char* to, const char* subject)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpMessageHeader(hNi, hSmtpConnect, from, to, subject);
}
void OnSmtpMessageEntityHeaderStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const char* mimeMainType, const char* mimeSubType,
const char* filename)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpMessageEntityHeader(hNi, hSmtpConnect, mimeMainType,
mimeSubType, filename);
}
void OnSmtpMessageEntityBodyStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect,
const BYTE* pData, DWORD length)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpMessageEntityBody(hNi, hSmtpConnect, pData, length);
}
void OnSmtpMessageEntityBodyEndStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpMessageEntityBodyEnd(hNi, hSmtpConnect);
}
void OnSmtpMessageTransferEndStub(HNETINFO hNi, HSMTPCONNECT hSmtpConnect)
{
CUserSmtpConnection *pSmtp = (CUserSmtpConnection*) GetConnectAttachData((HTCPCONNECT)hSmtpConnect);
if( pSmtp ) pSmtp->OnSmtpMessageTransferEnd(hNi, hSmtpConnect);
}
void OnPop3CommandStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect, const char* szCommand)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3Command(hNi, hPop3Connect, szCommand);
}
void OnPop3ReplyStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* szCommand, const char* szReply)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3Reply(hNi, hPop3Connect, szCommand, szReply);
}
void OnPop3MessageTransferBeginStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3MessageTransferBegin(hNi, hPop3Connect);
}
void OnPop3MessageHeaderStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* from, const char* to, const char* subject)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3MessageHeader(hNi, hPop3Connect, from, to, subject);
}
void OnPop3MessageEntityHeaderStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const char* mimeMainType, const char* mimeSubType,
const char* filename)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3MessageEntityHeader(hNi, hPop3Connect, mimeMainType,
mimeSubType, filename);
}
void OnPop3MessageEntityBodyStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect,
const BYTE* pData, DWORD length)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3MessageEntityBody(hNi, hPop3Connect, pData, length);
}
void OnPop3MessageEntityBodyEndStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3MessageEntityBodyEnd(hNi, hPop3Connect);
}
void OnPop3MessageTransferEndStub(HNETINFO hNi, HPOP3CONNECT hPop3Connect)
{
CUserPop3Connection *pPop3 = (CUserPop3Connection*) GetConnectAttachData((HTCPCONNECT)hPop3Connect);
if( pPop3 ) pPop3->OnPop3MessageTransferEnd(hNi, hPop3Connect);
}