hp-socket/global/helper.cpp

2477 lines
68 KiB
C++
Raw Permalink Normal View History

2025-10-24 20:41:49 +08:00
#include "helper.h"
#include "common/FileHelper.h"
#include <iostream>
using namespace std;
app_arg g_app_arg;
char app_arg::OPTIONS[] = ":a:p:b:d:j:t:e:i:c:l:s:m:o:z:x:y:n:r:u:k:w:q:hv";
app_arg::app_arg()
{
// -a
remote_addr = IPV4_LOOPBACK_ADDRESS;
// -p
port = DEF_TCP_UDP_PORT;
// -b
bind_addr = "";
// -d
local_port = 0;
// -j
reject_addr = "";
// -n
async = true;
// -t
thread_count = DEFAULT_WORKER_THREAD_COUNT;
// -e
test_times = 100;
// -i
test_interval = 1;
// -c
conn_count = 100;
// -l
data_length = 5000;
// -s
send_policy = SP_PACK;
// -m
max_conn = 10000;
// -q
keep_alive = true;
// -o
cast_mode = CM_MULTICAST;
// -r
reuse_addr = RAP_ADDR_ONLY;
// -u
ip_loop = true;
// -k
ttl = 1;
// -x
http_port = DEF_HTTP_PORT;
// -y
https_port = DEF_HTTPS_PORT;
// -z
http_use_cookie = true;
// -w
http_with_listener = true;;
}
app_arg::~app_arg()
{
PRINTLN("bye ~ bye ~");
}
void app_arg::ParseArgs(int argc, char* const argv[])
{
int c;
CString strOptArg;
while((c = ::getopt(argc, argv, OPTIONS)) != -1)
{
strOptArg = optarg;
if(strOptArg == "-")
strOptArg.Empty();
switch(c)
{
case 'a': remote_addr = strOptArg; break;
case 'p': port = (USHORT)atoi(strOptArg); break;
case 'b': bind_addr = strOptArg; break;
case 'd': local_port = (USHORT)atoi(strOptArg); break;
case 'j': reject_addr = strOptArg; break;
case 'n': async = (bool)atoi(strOptArg); break;
case 't': thread_count = (DWORD)atoi(strOptArg); break;
case 'e': test_times = (DWORD)atoi(strOptArg); break;
case 'i': test_interval = (DWORD)atoi(strOptArg); break;
case 'c': conn_count = (DWORD)atoi(strOptArg); break;
case 'l': data_length = (DWORD)atoi(strOptArg); break;
case 's': send_policy = (EnSendPolicy)atoi(strOptArg); break;
case 'm': max_conn = (DWORD)atoi(strOptArg); break;
case 'q': keep_alive = (bool)atoi(strOptArg); break;
case 'o': cast_mode = (EnCastMode)atoi(strOptArg); break;
case 'r': reuse_addr = (EnReuseAddressPolicy)atoi(strOptArg);break;
case 'u': ip_loop = (bool)atoi(strOptArg); break;
case 'k': ttl = (int)atoi(strOptArg); break;
case 'x': http_port = (USHORT)atoi(strOptArg); break;
case 'y': https_port = (USHORT)atoi(strOptArg); break;
case 'z': http_use_cookie = (bool)atoi(strOptArg); break;
case 'w': http_with_listener= (bool)atoi(strOptArg); break;
case 'v': PrintVersion(); exit(EXIT_CODE_OK);
case 'h': PrintUsage(); exit(EXIT_CODE_OK);
case '?': ERROR_EXIT2(EXIT_CODE_CONFIG, ERROR_INVALID_PARAMETER);
case ':': ERROR_EXIT2(EXIT_CODE_CONFIG, ERROR_INVALID_PARAMETER);
default: ERROR_EXIT2(EXIT_CODE_CONFIG, ERROR_OBJECT_NOT_FOUND);
}
}
}
void app_arg::PrintUsage()
{
PRINTLN("--------------------------- Command Line Args ---------------------------");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "a", "remote_addr", "b", "bind_addr", "c", "conn_count");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "d", "local_port", "e", "test_times", "h", "(PRINT THIS USAGE)");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "i", "test_interval", "j", "reject_addr", "k", "ttl");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "l", "data_length", "m", "max_conn", "n", "async");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "o", "cast_mode", "p", "port", "q", "keep_alive");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "r", "reuse_addr", "s", "send_policy", "t", "thread_count");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "u", "ip_loop", "v", "(PRINT VERSION)", "w", "http_with_listener");
PRINTLN(" -%s: %-20s-%s: %-20s-%s: %-20s", "x", "http_port", "y", "https_port", "z", "http_use_cookie");
PRINTLN("-------------------------------------------------------------------------");
}
void app_arg::PrintVersion()
{
DWORD dwVersion = ::GetHPSocketVersion();
DWORD dwMagor = dwVersion >> 24;
DWORD dwMinor = (dwVersion >> 16) & 0xFF;
DWORD dwRevise = (dwVersion >> 8) & 0xFF;
DWORD dwBuild = dwVersion & 0xFF;
PRINTLN("HP-Socket for Linux v%d.%d.%d [BN:%02d]", dwMagor, dwMinor, dwRevise, dwBuild);
}
void app_arg::ShowPFMTestArgs(BOOL bAgent)
{
PRINTLN("PFM Test Args:");
PRINTLN("-------------------+-------------------");
PRINTLN("%18s : %s", "remote_addr", (LPCTSTR)remote_addr);
PRINTLN("%18s : %u", "port", port);
PRINTLN("%18s : %u", "test_times", test_times);
PRINTLN("%18s : %u", "test_interval", test_interval);
PRINTLN("%18s : %u", "conn_count", conn_count);
PRINTLN("%18s : %u", "data_length", data_length);
if(bAgent) {
PRINTLN("%18s : %u", "thread_count", thread_count);
PRINTLN("%18s : %u", "max_conn", max_conn); }
PRINTLN("-------------------+-------------------");
}
CCommandParser::CCommandParser(CCommandParser::EnAppType enAppType, CMD_FUNC fnCmds[CT_MAX])
: m_enAppType(enAppType)
{
m_szCmdNameFuncs[CT_START] = {"start" , fnCmds[CT_START]};
m_szCmdNameFuncs[CT_STOP] = {"stop" , fnCmds[CT_STOP]};
m_szCmdNameFuncs[CT_STATUS] = {"status" , fnCmds[CT_STATUS]};
m_szCmdNameFuncs[CT_SEND] = {"send" , fnCmds[CT_SEND]};
m_szCmdNameFuncs[CT_SENDC] = {"sendc" , fnCmds[CT_SENDC]};
m_szCmdNameFuncs[CT_PAUSE] = {"pause" , fnCmds[CT_PAUSE]};
m_szCmdNameFuncs[CT_KICK] = {"kick" , fnCmds[CT_KICK]};
m_szCmdNameFuncs[CT_KICK_L] = {"kickl" , fnCmds[CT_KICK_L]};
m_szCmdNameFuncs[CT_KICK_S] = {"kicks" , fnCmds[CT_KICK_S]};
m_szCmdNameFuncs[CT_CONNECT]= {"connect" , fnCmds[CT_CONNECT]};
m_szCmdNameFuncs[CT_STAT] = {"stat" , fnCmds[CT_STAT]};
Reset();
}
BOOL CCommandParser::Run()
{
if(m_thWorker.IsRunning())
return FALSE;
Reset();
return m_thWorker.Start(this, &CCommandParser::WorkerProc) && WaitForExit();
}
BOOL CCommandParser::WaitForExit()
{
return m_thWorker.Join();
}
void CCommandParser::WorkerProc(PVOID pv)
{
CString strLine;
PrintUsage();
printf("> ");
while(TRUE)
{
Reset();
if(!std::getline(cin, strLine))
{
PRINTLN();
break;
}
Parse((LPTSTR)(LPCTSTR)strLine, strLine.GetLength());
printf("> ");
}
/*
PrintUsage();
char* lpszLine = nullptr;
SIZE_T nSize = 0;
printf("> ");
while(TRUE)
{
Reset();
SSIZE_T nRead = getline(&lpszLine, &nSize, stdin);
if(nRead == EOF)
{
PRINTLN();
break;
}
lpszLine[--nRead] = 0;
Parse(lpszLine, nRead);
printf("> ");
if(nSize >= 4096)
{
free(lpszLine);
lpszLine = nullptr;
nSize = 0;
}
}
free(lpszLine);
*/
}
void CCommandParser::Parse(LPTSTR lpszLine, SSIZE_T nLength)
{
LPTSTR lpszArg = lpszLine;
LPTSTR lpszCmd = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszCmd))
return;
int i = CT_START;
for(; i < CT_MAX; i++)
{
if(strcmp(lpszCmd, m_szCmdNameFuncs[i].name) == 0)
break;
}
EnCmdType type = (EnCmdType)i;
if(type == CT_MAX)
{
if(strcmp(lpszCmd, "?") == 0)
PrintUsage();
else if(strcmp(lpszCmd, "args") == 0)
app_arg::PrintUsage();
else
{
PRINTLN(" '%s' : command NOT found ~", lpszCmd);
}
return;
}
if( ((m_enAppType == AT_CLIENT || m_enAppType == AT_NODE) &&
(type == CT_KICK || type == CT_KICK_L || type == CT_KICK_S))
|| (m_enAppType == AT_SERVER && type == CT_CONNECT )
|| (m_enAppType != AT_NODE && type == CT_SENDC) )
{
PRINTLN(" '%s' : command NOT supported ~", lpszCmd);
return;
}
if(m_szCmdNameFuncs[type].func == nullptr)
{
PRINTLN(" '%s' : command NOT handled ~", lpszCmd);
return;
}
ParseCmdArgs(type, lpszArg);
}
void CCommandParser::ParseCmdArgs(EnCmdType type, LPTSTR lpszArg)
{
ASSERT(type >= CT_START && type < CT_MAX);
LPTSTR lpszParam1 = lpszArg;
if( (m_enAppType != AT_CLIENT || type != CT_SEND) &&
(m_enAppType != AT_NODE || type != CT_SENDC) )
lpszParam1 = ::StrSep2(&lpszArg, " \t");
if(type == CT_START || type == CT_STOP || type == CT_STATUS || type == CT_STAT)
{
if(!::IsStrEmpty(lpszParam1))
goto ERROR_USAGE;
}
else if(type == CT_SEND)
{
LPTSTR lpszMsg = nullptr;
if(m_enAppType == AT_CLIENT)
lpszMsg = lpszParam1;
else if(m_enAppType == AT_NODE)
{
LPTSTR lpszHost = lpszParam1;
if(::IsStrEmpty(lpszHost))
goto ERROR_USAGE;
m_strRemoteAddr = lpszHost;
LPTSTR lpszPort = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszPort))
goto ERROR_USAGE;
if((m_usRemotePort = (USHORT)atoi(lpszPort)) <= 0)
goto ERROR_USAGE;
lpszMsg = lpszArg;
}
else
{
LPTSTR lpszConnID = lpszParam1;
if(::IsStrEmpty(lpszConnID))
goto ERROR_USAGE;
if((m_dwConnID = atol(lpszConnID)) <= 0)
goto ERROR_USAGE;
lpszMsg = lpszArg;
}
while(!::IsStrEmpty(lpszMsg))
{
if(lpszMsg[0] != ' ' && lpszMsg[0] != '\t')
break;
++lpszMsg;
}
if(m_enAppType != AT_NODE && ::IsStrEmpty(lpszMsg))
goto ERROR_USAGE;
m_strMessage = lpszMsg;
}
else if(type == CT_SENDC)
{
ASSERT(m_enAppType == AT_NODE);
LPTSTR lpszMsg = lpszParam1;
while(!::IsStrEmpty(lpszMsg))
{
if(lpszMsg[0] != ' ' && lpszMsg[0] != '\t')
break;
++lpszMsg;
}
m_strMessage = lpszMsg;
}
else if(type == CT_PAUSE || type == CT_KICK)
{
LPTSTR lpszFlag = nullptr;
if(m_enAppType == AT_CLIENT)
lpszFlag = lpszParam1;
else
{
LPTSTR lpszConnID = lpszParam1;
if(::IsStrEmpty(lpszConnID))
goto ERROR_USAGE;
if((m_dwConnID = atol(lpszConnID)) <= 0)
goto ERROR_USAGE;
lpszFlag = ::StrSep2(&lpszArg, " \t");
}
if(::IsStrEmpty(lpszFlag))
m_bFlag = TRUE;
else
{
if(!::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
goto ERROR_USAGE;
if(::IsStrEmpty(lpszFlag) || (lpszFlag[0] != '0' && lpszFlag[0] != '1') || lpszFlag[1] != 0)
goto ERROR_USAGE;
m_bFlag = (BOOL)(lpszFlag[0] - '0');
}
}
else if(type == CT_KICK_L || type == CT_KICK_S)
{
ASSERT(m_enAppType != AT_CLIENT);
LPTSTR lpszSeconds = lpszParam1;
if(::IsStrEmpty(lpszSeconds))
{
m_dwSeconds = 60;
m_bFlag = TRUE;
}
else
{
if(((int)(m_dwSeconds = atoi(lpszSeconds))) <= 0)
goto ERROR_USAGE;
LPTSTR lpszFlag = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszFlag))
m_bFlag = TRUE;
else
{
if(!::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
goto ERROR_USAGE;
if(::IsStrEmpty(lpszFlag) || (lpszFlag[0] != '0' && lpszFlag[0] != '1') || lpszFlag[1] != 0)
goto ERROR_USAGE;
m_bFlag = (BOOL)(lpszFlag[0] - '0');
}
}
}
else if(type == CT_CONNECT)
{
ASSERT(m_enAppType == AT_AGENT);
LPTSTR lpszHost = lpszParam1;
if(::IsStrEmpty(lpszHost))
{
m_strRemoteAddr = g_app_arg.remote_addr;
m_usRemotePort = g_app_arg.port;
}
else
{
LPTSTR lpszPort = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszPort) || !::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
goto ERROR_USAGE;
if((m_usRemotePort = (USHORT)atoi(lpszPort)) <= 0)
goto ERROR_USAGE;
m_strRemoteAddr = lpszHost;
}
}
m_szCmdNameFuncs[type].func(this);
return;
ERROR_USAGE:
PRINTLN(" '%s' usage : %s", m_szCmdNameFuncs[type].name, (LPCTSTR)GetCmdUsage(type));
}
void CCommandParser::Reset()
{
m_bFlag = TRUE;
m_dwConnID = 0;
m_usRemotePort = 0;
m_dwSeconds = 0;
m_strMessage = nullptr;
m_strRemoteAddr = nullptr;
}
void CCommandParser::PrintUsage()
{
PRINTLN("------ ACTION -----+----------------------- USAGE -----------------------");
PrintCmdUsage();
PRINTLN("%-18s : %6s%s", "Print Usage", "", "?");
PRINTLN("%-18s : %3s%s", "Print Command Args", "", "args");
PRINTLN("%-18s : %1s%s", "Quit", "", "Ctrl+D");
PRINTLN("-------------------+-----------------------------------------------------");
}
void CCommandParser::PrintCmdUsage()
{
if(m_szCmdNameFuncs[CT_START].func)
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
if(m_szCmdNameFuncs[CT_STOP].func)
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
if(m_szCmdNameFuncs[CT_STATUS].func)
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
if(m_szCmdNameFuncs[CT_CONNECT].func && m_enAppType == AT_AGENT)
PRINTLN("%-18s : %s%s", "Connect To", "", (LPCTSTR)GetCmdUsage(CT_CONNECT));
if(m_szCmdNameFuncs[CT_SEND].func)
PRINTLN("%-18s : %3s%s", "Send Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
if(m_szCmdNameFuncs[CT_SENDC].func)
PRINTLN("%-18s : %2s%s", "Send Cast Message", "", (LPCTSTR)GetCmdUsage(CT_SENDC));
if(m_szCmdNameFuncs[CT_PAUSE].func)
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
if(m_enAppType != AT_CLIENT) {
if(m_szCmdNameFuncs[CT_KICK].func)
PRINTLN("%-18s : %3s%s", "Kick Connection", "", (LPCTSTR)GetCmdUsage(CT_KICK));
if(m_szCmdNameFuncs[CT_KICK_L].func)
PRINTLN("%-18s : %2s%s", "Kick Long Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_L));
if(m_szCmdNameFuncs[CT_KICK_S].func)
PRINTLN("%-18s : %2s%s", "Kick Silence Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_S)); }
if(m_enAppType == AT_SERVER) {
if(m_szCmdNameFuncs[CT_STAT].func)
PRINTLN("%-18s : %3s%s", "Stat R/S bytes", "", (LPCTSTR)GetCmdUsage(CT_STAT)); }
}
CString CCommandParser::GetCmdUsage(CCommandParser::EnCmdType type)
{
CString strUsage = m_szCmdNameFuncs[type].name;
switch(type)
{
case CT_SEND:
if(m_enAppType == AT_NODE)
strUsage += " {Host} {Port} [{Message}]";
else
{
if(m_enAppType != AT_CLIENT)
strUsage += " {ConnID}";
strUsage += " {Message}";
}
break;
case CT_SENDC:
strUsage += " [{Message}]";
break;
case CT_PAUSE:
if(m_enAppType != AT_CLIENT)
strUsage += " {ConnID}";
strUsage += " [0|1] # (0 - unpause, 1 - pause)";
break;
case CT_KICK:
if(m_enAppType != AT_CLIENT)
strUsage += " {ConnID} [0|1] # (0 - unforced, 1 - forced)";
else
strUsage = nullptr;
break;
case CT_KICK_L:
case CT_KICK_S:
if(m_enAppType != AT_CLIENT)
strUsage += " [{Seconds}] [0|1] # (default: {60, 1})";
else
strUsage = nullptr;
break;
case CT_CONNECT:
if(m_enAppType != AT_SERVER)
strUsage += " [{Host} {Port}]";
else
strUsage = nullptr;
break;
default :
;
}
return strUsage;
}
void CCommandParser::PrintStatus(EnServiceState enStatus, LPCTSTR lpszName)
{
CString strStatus;
if(m_enAppType == AT_SERVER)
strStatus += "Server";
else if(m_enAppType == AT_AGENT)
strStatus += "Agent";
else if(m_enAppType == AT_CLIENT)
strStatus += "Client";
else if(m_enAppType == AT_NODE)
strStatus += "Node";
else
ASSERT(FALSE);
if(!::IsStrEmpty(lpszName))
strStatus.AppendChar(' ').Append(lpszName);
if(enStatus == SS_STARTING)
strStatus += " is starting";
else if(enStatus == SS_STARTED)
strStatus += " has started";
else if(enStatus == SS_STOPPING)
strStatus += " is stopping";
else if(enStatus == SS_STOPPED)
strStatus += " has stopped";
else
ASSERT(FALSE);
puts(strStatus);
}
#ifdef _NEED_HTTP
void CHttpCommandParser::ParseCmdArgs(EnCmdType type, LPTSTR lpszArg)
{
ASSERT(type >= CT_START && type < CT_MAX);
switch(type)
{
case CT_START:
{
if(m_enAppType == CCommandParser::AT_SERVER)
{
LPTSTR lpszParam1 = ::StrSep2(&lpszArg, " \t");
if(!::IsStrEmpty(lpszParam1))
goto ERROR_USAGE;
}
else if(!ParseCmdOptions(lpszArg, ":s:"))
goto ERROR_USAGE;
}
break;
case CT_STOP:
case CT_STAT:
case CT_STATUS:
{
LPTSTR lpszParam1 = ::StrSep2(&lpszArg, " \t");
if(!::IsStrEmpty(lpszParam1))
goto ERROR_USAGE;
}
break;
case CT_SEND:
{
if(m_enAppType != AT_CLIENT)
{
LPTSTR lpszConnID = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszConnID))
goto ERROR_USAGE;
if((m_dwConnID = atol(lpszConnID)) <= 0)
goto ERROR_USAGE;
}
if(m_enAppType == AT_SERVER)
{
if(!ParseCmdOptions(lpszArg, ":s:d:"))
goto ERROR_USAGE;
}
else
{
if(!ParseCmdOptions(lpszArg, ":p:x:h:d:f:"))
goto ERROR_USAGE;
if(m_strPath.IsEmpty())
m_strPath = "/";
if(m_strMethod.IsEmpty())
m_strMethod = HTTP_METHOD_GET;
}
}
break;
case CT_KICK:
{
LPTSTR lpszConnID = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszConnID))
goto ERROR_USAGE;
if((m_dwConnID = atol(lpszConnID)) <= 0)
goto ERROR_USAGE;
if(m_enAppType == AT_SERVER && !ParseCmdOptions(lpszArg, ":s:"))
goto ERROR_USAGE;
else if(m_enAppType == AT_AGENT && !::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
goto ERROR_USAGE;
}
break;
case CT_KICK_L:
case CT_KICK_S:
{
m_dwSeconds = 60;
if(::IsStrEmpty(lpszArg))
break;
char c = ::TrimLeft(&lpszArg, " \t")[0];
if(c == 0)
break;
else if(c == '-')
{
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
goto ERROR_USAGE;
}
else
{
LPTSTR lpszSeconds = ::StrSep2(&lpszArg, " \t");
if(((int)(m_dwSeconds = atoi(lpszSeconds))) <= 0)
goto ERROR_USAGE;
if(::IsStrEmpty(lpszArg))
break;
char c = ::TrimLeft(&lpszArg, " \t")[0];
if(c == 0)
break;
else if(c == '-')
{
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
goto ERROR_USAGE;
}
else
goto ERROR_USAGE;
}
}
break;
case CT_PAUSE:
{
if(m_enAppType != AT_CLIENT)
{
LPTSTR lpszConnID = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszConnID))
goto ERROR_USAGE;
if((m_dwConnID = atol(lpszConnID)) <= 0)
goto ERROR_USAGE;
}
m_bFlag = TRUE;
if(::IsStrEmpty(lpszArg))
break;
char c = ::TrimLeft(&lpszArg, " \t")[0];
if(c == 0)
break;
else if(c == '-')
{
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
goto ERROR_USAGE;
}
else
{
LPTSTR lpszFlag = ::StrSep2(&lpszArg, " \t");
if((lpszFlag[0] != '0' && lpszFlag[0] != '1') || lpszFlag[1] != 0)
goto ERROR_USAGE;
m_bFlag = (BOOL)(lpszFlag[0] - '0');
if(::IsStrEmpty(lpszArg))
break;
char c = ::TrimLeft(&lpszArg, " \t")[0];
if(c == 0)
break;
else if(c == '-')
{
if(m_enAppType != AT_SERVER || !ParseCmdOptions(lpszArg, ":s:"))
goto ERROR_USAGE;
}
else
goto ERROR_USAGE;
}
}
break;
case CT_CONNECT:
{
if(m_enAppType == AT_AGENT)
{
LPTSTR lpszHost = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszHost))
{
m_strRemoteAddr = g_app_arg.remote_addr;
m_usRemotePort = 0;
}
else
{
LPTSTR lpszPort = ::StrSep2(&lpszArg, " \t");
if(::IsStrEmpty(lpszPort) || !::IsStrEmpty(::StrSep2(&lpszArg, " \t")))
goto ERROR_USAGE;
if((m_usRemotePort = (USHORT)atoi(lpszPort)) <= 0)
goto ERROR_USAGE;
m_strRemoteAddr = lpszHost;
}
}
else if(m_enAppType == AT_CLIENT)
{
m_bFlag = FALSE;
m_strPath = ::StrSep2(&lpszArg, " \t");
if(m_strPath.IsEmpty())
goto ERROR_USAGE;
if(strnicmp(m_strPath, STR_HTTPS_SCHEMA, strlen(STR_HTTPS_SCHEMA)) == 0)
m_bHttps = TRUE;
else if(strnicmp(m_strPath, STR_HTTP_SCHEMA, strlen(STR_HTTP_SCHEMA)) == 0)
m_bHttps = FALSE;
else
goto ERROR_USAGE;
if(!ParseCmdOptions(lpszArg, ":x:h:d:f:r:"))
goto ERROR_USAGE;
if(m_strMethod.IsEmpty())
m_strMethod = HTTP_METHOD_GET;
}
}
break;
default:
ASSERT(FALSE);
}
m_szCmdNameFuncs[type].func(this);
return;
ERROR_USAGE:
PRINTLN(" '%s' usage : %s", m_szCmdNameFuncs[type].name, (LPCTSTR)GetCmdUsage(type));
}
BOOL CHttpCommandParser::ParseCmdOptions(LPCTSTR lpszArg, LPCTSTR lpszOptions)
{
if(::IsStrEmpty(lpszArg))
return TRUE;
vector<CString> vtItem;
if(!SplitStr(lpszArg, vtItem, " \t", "\'\""))
return FALSE;
int iSize = (int)vtItem.size();
if(iSize % 2 != 0)
return FALSE;
for(int i = 0; i < iSize; i += 2)
{
CString& strOpt = vtItem[i];
CString& strVal = vtItem[i + 1];
if(strOpt.GetLength() != 2 || strOpt[0] != '-')
return FALSE;
TCHAR c = strOpt[1];
if(c == ':' || ::StrChr(lpszOptions, c) == nullptr)
return FALSE;
if(c == 's')
{
if(strVal != "0" && strVal != "1")
return FALSE;
m_bHttps = (BOOL)(strVal[0] - '0');
}
else if(c == 'p')
{
m_strPath = strVal;
}
else if(c == 'x')
{
m_strMethod = strVal;
m_strMethod.MakeUpper();
}
else if(c == 'h')
{
int iPos = strVal.Find(':');
if(iPos <= 0)
return FALSE;
m_vtHeaders.push_back(strVal.Left(iPos));
m_vtHeaders.push_back(strVal.Mid(iPos + 1).Trim());
}
else if(c == 'd')
{
m_strData = strVal;
}
else if(c == 'f')
{
m_strFilePath = strVal;
}
else if(c == 'r')
{
if(strVal != "0" && strVal != "1")
return FALSE;
m_bFlag = (BOOL)(strVal[0] - '0');
}
else
{
return FALSE;
}
}
return TRUE;
}
void CHttpCommandParser::Reset()
{
__super::Reset();
m_vtHeaders.clear();
m_bHttps = FALSE;
m_strPath = nullptr;
m_strMethod = nullptr;
m_strData = nullptr;
m_strFilePath = nullptr;
}
void CHttpCommandParser::PrintCmdUsage()
{
switch(m_enAppType)
{
case AT_SERVER:
if(m_szCmdNameFuncs[CT_START].func)
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
if(m_szCmdNameFuncs[CT_STOP].func)
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
if(m_szCmdNameFuncs[CT_STATUS].func)
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
if(m_szCmdNameFuncs[CT_SEND].func)
PRINTLN("%-18s : %3s%s", "Send WS Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
if(m_szCmdNameFuncs[CT_PAUSE].func)
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
if(m_szCmdNameFuncs[CT_KICK].func)
PRINTLN("%-18s : %3s%s", "Release Connection", "", (LPCTSTR)GetCmdUsage(CT_KICK));
if(m_szCmdNameFuncs[CT_KICK_L].func)
PRINTLN("%-18s : %2s%s", "Kick Long Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_L));
if(m_szCmdNameFuncs[CT_KICK_S].func)
PRINTLN("%-18s : %2s%s", "Kick Silence Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_S));
if(m_szCmdNameFuncs[CT_STAT].func)
PRINTLN("%-18s : %3s%s", "Stat R/S bytes", "", (LPCTSTR)GetCmdUsage(CT_STAT));
break;
case AT_AGENT:
if(m_szCmdNameFuncs[CT_START].func)
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
if(m_szCmdNameFuncs[CT_STOP].func)
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
if(m_szCmdNameFuncs[CT_STATUS].func)
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
if(m_szCmdNameFuncs[CT_CONNECT].func)
PRINTLN("%-18s : %s%s", "Connect To", "", (LPCTSTR)GetCmdUsage(CT_CONNECT));
if(m_szCmdNameFuncs[CT_SEND].func)
PRINTLN("%-18s : %3s%s", "Send Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
if(m_szCmdNameFuncs[CT_PAUSE].func)
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
if(m_szCmdNameFuncs[CT_KICK].func)
PRINTLN("%-18s : %3s%s", "Kick Connection", "", (LPCTSTR)GetCmdUsage(CT_KICK));
if(m_szCmdNameFuncs[CT_KICK_L].func)
PRINTLN("%-18s : %2s%s", "Kick Long Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_L));
if(m_szCmdNameFuncs[CT_KICK_S].func)
PRINTLN("%-18s : %2s%s", "Kick Silence Conns", "", (LPCTSTR)GetCmdUsage(CT_KICK_S));
break;
case AT_CLIENT:
if(m_szCmdNameFuncs[CT_START].func)
PRINTLN("%-18s : %2s%s", "Start Up", "", (LPCTSTR)GetCmdUsage(CT_START));
if(m_szCmdNameFuncs[CT_STOP].func)
PRINTLN("%-18s : %3s%s", "Shut Down", "", (LPCTSTR)GetCmdUsage(CT_STOP));
if(m_szCmdNameFuncs[CT_STATUS].func)
PRINTLN("%-18s : %1s%s", "Show Status", "", (LPCTSTR)GetCmdUsage(CT_STATUS));
if(m_szCmdNameFuncs[CT_CONNECT].func)
PRINTLN("%-18s : %s%s", "Open URL", "", (LPCTSTR)GetCmdUsage(CT_CONNECT));
if(m_szCmdNameFuncs[CT_SEND].func)
PRINTLN("%-18s : %3s%s", "Send Message", "", (LPCTSTR)GetCmdUsage(CT_SEND));
if(m_szCmdNameFuncs[CT_PAUSE].func)
PRINTLN("%-18s : %2s%s", "Pause/Unpause Recv", "", (LPCTSTR)GetCmdUsage(CT_PAUSE));
break;
default:
ASSERT(FALSE);
}
}
CString CHttpCommandParser::GetCmdUsage(CCommandParser::EnCmdType type)
{
CString strUsage = m_szCmdNameFuncs[type].name;
switch(type)
{
case CT_START:
if(m_enAppType != AT_SERVER)
strUsage += " [-s 0|1] # (s-0 - http, s-1 - https)";
break;
case CT_SEND:
if(m_enAppType == AT_SERVER)
strUsage += " {ConnID} [-s 0|1] -d {WS-Data} # (WS only, s-0 - ws, s-1 - wss)";
else
{
if(m_enAppType != AT_CLIENT)
strUsage += " {ConnID}";
strUsage += " [-x {Method}] [-p {Path}] [-h {Header}]* [-d {Data}] [-f {File}]";
}
break;
case CT_PAUSE:
if(m_enAppType != AT_CLIENT)
strUsage += " {ConnID}";
strUsage += " [0|1]";
if(m_enAppType == AT_SERVER)
strUsage += " [-s 0|1]";
strUsage += " # (0 - unpause, 1 - pause";
if(m_enAppType == AT_SERVER)
strUsage += ", s-0 - http, s-1 - https";
strUsage += ")";
break;
case CT_KICK:
if(m_enAppType == AT_CLIENT)
strUsage = nullptr;
else
{
strUsage += " {ConnID}";
if(m_enAppType == AT_SERVER)
strUsage += " [-s 0|1] # (s-0 - http, s-1 - https)";
}
break;
case CT_KICK_L:
case CT_KICK_S:
if(m_enAppType == AT_CLIENT)
strUsage = nullptr;
else
{
strUsage += " [{Seconds}]";
if(m_enAppType == AT_SERVER)
strUsage += " [-s 0|1] # (default: 60s, s-0 - http, s-1 - https)";
else
strUsage += " # (default: 60s)";
}
break;
case CT_CONNECT:
if(m_enAppType == AT_AGENT)
strUsage += " [{Host} {Port}]";
else if(m_enAppType == AT_CLIENT)
strUsage += " {URL} [-x {Method}] [-h {Header}]* [-d {Data}] [-f {File}] [-r 0|1] # (r-0 - reuse connection, r-1 - force reconnect)";
else
strUsage = nullptr;
break;
default :
;
}
return strUsage;
}
#endif
void server_statistics_info::Reset(BOOL bResetClientCount)
{
if(bResetClientCount)
m_lClientCount = 0L;
m_llTotalSent = 0L;
m_llTotalReceived = 0L;
}
void server_statistics_info::AddTotalRecv(int iLength)
{
::InterlockedExchangeAdd(&m_llTotalReceived, iLength);
}
void server_statistics_info::AddTotalSend(int iLength)
{
::InterlockedExchangeAdd(&m_llTotalSent, iLength);
}
void server_statistics_info::CheckClientCount()
{
if(m_lClientCount == 0)
{
CCriSecLock lock(m_cs);
if(m_lClientCount == 0)
{
Reset(FALSE);
}
}
InterlockedIncrement(&m_lClientCount);
}
void server_statistics_info::CheckStatistics()
{
if(m_lClientCount > 0)
{
CCriSecLock lock(m_cs);
if(m_lClientCount > 0)
{
::InterlockedDecrement(&m_lClientCount);
if(m_lClientCount == 0)
{
::WaitFor(500L);
::PostServerStatics((LONGLONG)m_llTotalSent, (LONGLONG)m_llTotalReceived);
printf("> ");
fflush(stdout);
}
}
}
}
void client_statistics_info::Reset()
{
m_iConnected = 0;
m_dwBeginTickCount = 0;
m_dwTimeconsuming = 0;
m_llTotalReceived = 0;
m_llTotalSent = 0;
m_llExpectReceived = (LONGLONG)g_app_arg.test_times * (LONGLONG)g_app_arg.conn_count * (LONGLONG)g_app_arg.data_length;
}
void client_statistics_info::StartTest()
{
m_dwBeginTickCount = ::TimeGetTime();
}
void client_statistics_info::AddTotalRecv(int iLength)
{
::InterlockedExchangeAdd(&m_llTotalReceived, iLength);
if(m_llTotalReceived == m_llExpectReceived)
{
m_dwTimeconsuming = ::GetTimeGap32(m_dwBeginTickCount);
::PostTimeConsuming(m_dwTimeconsuming);
printf("> ");
fflush(stdout);
}
ASSERT(m_llTotalReceived <= m_llExpectReceived);
}
void client_statistics_info::AddTotalSend(int iLength)
{
::InterlockedExchangeAdd(&m_llTotalSent, iLength);
}
void client_statistics_info::TermConnected()
{
if(m_iConnected >= 0)
m_iConnected = -0xFFFFFF;
}
void client_statistics_info::AddConnected()
{
::InterlockedIncrement(&m_iConnected);
}
int client_statistics_info::GetConnected()
{
return m_iConnected;
}
void client_statistics_info::CheckStatistics(BOOL bCheckSend)
{
::WaitFor(100L);
CString strMsg;
strMsg.Format( _T("*** Summary: expect - %lld, send - %lld, recv - %lld ***"),
m_llExpectReceived, m_llTotalSent, m_llTotalReceived);
::LogMsg(strMsg);
if(m_llExpectReceived == m_llTotalReceived && (!bCheckSend || m_llTotalSent == m_llExpectReceived))
strMsg.Format(_T("*** Success: time consuming - %u millisecond ! ***"), m_dwTimeconsuming);
else
strMsg.Format(_T("*** Fail: manual terminated ? (or data lost) ***"));
::LogMsg(strMsg);
}
info_msg* info_msg::Construct(CONNID dwConnID, LPCTSTR lpszEvent, int iContentLength, LPCTSTR lpszContent, LPCTSTR lpszName)
{
return new info_msg(dwConnID, lpszEvent, iContentLength, lpszContent, lpszName);
}
void info_msg::Destruct(info_msg* pMsg)
{
delete pMsg;
}
info_msg::info_msg(CONNID dwConnID, LPCTSTR lpszEvent, int iContentLength, LPCTSTR lpszContent, LPCTSTR lpszName)
: connID(dwConnID), evt(lpszEvent), contentLength(iContentLength), content(lpszContent), name(nullptr)
{
if(lpszName)
{
int len = lstrlen(lpszName);
if(len > 0)
{
name = new TCHAR[len + 1];
memcpy((LPSTR)name, lpszName, (len + 1) * sizeof(TCHAR));
}
}
}
info_msg::~info_msg()
{
if(name)
delete[] name;
if(contentLength > 0)
delete[] content;
}
inline CString SafeString(LPCTSTR lpszName)
{
CString str(lpszName);
if(lpszName) str.AppendChar(' ');
return str;
}
inline CString SafeString2(LPCTSTR lpszName)
{
CString str(lpszName);
if(lpszName) str.Append(_T(" #"));
return str;
}
void LogServerStart(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sServer Start OK --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
LogMsg(msg);
}
void LogServerStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sServer Start Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
LogMsg(msg);
}
void LogServerStop(LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sServer Stop"), (LPCTSTR)SafeString(lpszName));
LogMsg(msg);
}
void LogServerStopFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sServer Stop Fail --> %s (%d)"), (LPCTSTR)SafeString(lpszName), lpszDesc, code);
LogMsg(msg);
}
void LogAgentStart(LPCTSTR lpszAddress, BOOL bAsync, LPCTSTR lpszName)
{
if(!lpszAddress || lpszAddress[0] == 0)
lpszAddress = _T("***");
char c = bAsync ? 'A' : 'S';
CString msg;
msg.Format(_T("# %sAgent Start OK --> (%s - %c)"), (LPCTSTR)SafeString(lpszName), lpszAddress, c);
LogMsg(msg);
}
void LogAgentStarting(LPCTSTR lpszAddress, BOOL bAsync, LPCTSTR lpszName)
{
if(!lpszAddress || lpszAddress[0] == 0)
lpszAddress = _T("***");
char c = bAsync ? 'A' : 'S';
CString msg;
msg.Format(_T("# %sAgent Starting --> (%s - %d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, c);
LogMsg(msg);
}
void LogAgentStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sAgent Start Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
LogMsg(msg);
}
void LogAgentStopping(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sAgent Stopping --> (%zu)"), (LPCTSTR)SafeString(lpszName), dwConnID);
LogMsg(msg);
}
void LogAgentStop(LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sAgent Stop"), (LPCTSTR)SafeString(lpszName));
LogMsg(msg);
}
void LogAgentStopFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sAgent Stop Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
LogMsg(msg);
}
void LogAgentSendFail(int iSequence, int iSocketIndex, DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sAgent Send Fail [SOCK: %d, SEQ: %d] --> %s (%d)"), (LPCTSTR)SafeString(lpszName), iSocketIndex, iSequence, lpszDesc, code);
LogMsg(msg);
}
void LogClientStart(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sClient Start OK --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
LogMsg(msg);
}
void LogClientStarting(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sClient Starting --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
LogMsg(msg);
}
void LogClientStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sClient Start Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
LogMsg(msg);
}
void LogClientStopping(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sClient Stopping --> (%zu)"), (LPCTSTR)SafeString(lpszName), dwConnID);
LogMsg(msg);
}
void LogClientStop(LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sClient Stop"), (LPCTSTR)SafeString(lpszName));
LogMsg(msg);
}
void LogClientStopFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sClient Stop Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
LogMsg(msg);
}
void LogClientSendFail(int iSequence, int iSocketIndex, DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sClient Send Fail [SOCK: %d, SEQ: %d] --> %s (%d)"), (LPCTSTR)SafeString(lpszName), iSocketIndex, iSequence, lpszDesc, code);
LogMsg(msg);
}
void LogStart(LPCTSTR lpszAddress, USHORT port, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sStart OK --> (%s#%d)"), (LPCTSTR)SafeString(lpszName), lpszAddress, port);
LogMsg(msg);
}
void LogStartFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sStart Fail --> %s (%d) [%d]"), (LPCTSTR)SafeString(lpszName), lpszDesc, code, ::GetLastError());
LogMsg(msg);
}
void LogStop(LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sStop"), (LPCTSTR)SafeString(lpszName));
LogMsg(msg);
}
void LogSend(CONNID dwConnID, LPCTSTR lpszContent, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu Send OK --> %s"), (LPCTSTR)SafeString2(lpszName), dwConnID, lpszContent);
LogMsg(msg);
}
void LogSend(LPCTSTR lpszContent, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sSend OK --> %s"), (LPCTSTR)SafeString(lpszName), lpszContent);
LogMsg(msg);
}
void LogSending(CONNID dwConnID, LPCTSTR lpszContent, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu Sending --> %s"), (LPCTSTR)SafeString2(lpszName), dwConnID, lpszContent);
LogMsg(msg);
}
void LogSendFail(CONNID dwConnID, DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu Send Fail --> %s (%d)"), (LPCTSTR)SafeString2(lpszName), dwConnID, lpszDesc, code);
LogMsg(msg);
}
void LogSendFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sSend Fail --> %s (%d)"), (LPCTSTR)SafeString(lpszName), lpszDesc, code);
LogMsg(msg);
}
void LogDisconnect(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Disconnect OK"), (LPCTSTR)SafeString2(lpszName), dwConnID);
LogMsg(msg);
}
void LogDisconnectFail(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Disconnect Fail"), (LPCTSTR)SafeString2(lpszName), dwConnID);
LogMsg(msg);
}
void LogDisconnect2(CONNID dwConnID, BOOL bForce, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Disconnect OK (%c)"), (LPCTSTR)SafeString2(lpszName), dwConnID, bForce ? 'F' : 'N');
LogMsg(msg);
}
void LogDisconnectFail2(CONNID dwConnID, BOOL bForce, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Disconnect Fail (%c)"), (LPCTSTR)SafeString2(lpszName), dwConnID, bForce ? 'F' : 'N');
LogMsg(msg);
}
void LogDisconnectLong(DWORD dwSeconds, BOOL bForce, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sDisconnect OK (%us, %c)"), (LPCTSTR)SafeString(lpszName), dwSeconds, bForce ? 'F' : 'N');
LogMsg(msg);
}
void LogDisconnectFailLong(DWORD dwSeconds, BOOL bForce, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sDisconnect Fail (%us, %c)"), (LPCTSTR)SafeString(lpszName), dwSeconds, bForce ? 'F' : 'N');
LogMsg(msg);
}
void LogPause(CONNID dwConnID, BOOL bPause, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, %s OK"), (LPCTSTR)SafeString2(lpszName), dwConnID, bPause ? "Pause" : "Unpause");
LogMsg(msg);
}
void LogPauseFail(CONNID dwConnID, BOOL bPause, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, %s Fail --> %s (%d)"), (LPCTSTR)SafeString2(lpszName), dwConnID, bPause ? "Pause" : "Unpause", ::GetLastErrorStr(), ::GetLastError());
LogMsg(msg);
}
void LogConnect(LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sConnecting to %s#%d ..."), (LPCTSTR)SafeString(lpszName), lpszAddress, usPort);
LogMsg(msg);
}
void LogConnectFail(DWORD code, LPCTSTR lpszDesc, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %sConnect Fail --> %s (%d)"), (LPCTSTR)SafeString(lpszName), lpszDesc, code);
LogMsg(msg);
}
void LogRelease(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Release OK"), (LPCTSTR)SafeString2(lpszName), dwConnID);
LogMsg(msg);
}
void LogReleaseFail(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Release Fail"), (LPCTSTR)SafeString2(lpszName), dwConnID);
LogMsg(msg);
}
void LogDetect(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Detect Connection OK"), (LPCTSTR)SafeString2(lpszName), dwConnID);
LogMsg(msg);
}
void LogDetectFail(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T("# %s%zu, Detect Connection Fail"), (LPCTSTR)SafeString2(lpszName), dwConnID);
LogMsg(msg);
}
void LogOnConnect(CONNID dwConnID, const CString& strAddress, USHORT usPort, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("local address: %s#%d"), (LPCTSTR)strAddress, usPort);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
LogInfoMsg(msg);
}
void LogOnConnect2(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T(" > [ %s%zu, %s ]"), (LPCTSTR)SafeString2(lpszName), dwConnID, EVT_ON_CONNECT);
LogMsg(msg);
}
void LogOnConnect3(CONNID dwConnID, const CString& strAddress, USHORT usPort, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("remote address: %s#%d"), (LPCTSTR)strAddress, usPort);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
LogInfoMsg(msg);
}
void LogOnHandShake2(CONNID dwConnID, LPCTSTR lpszName)
{
CString msg;
msg.Format(_T(" > [ %s%zu, %s ]"), (LPCTSTR)SafeString2(lpszName), dwConnID, EVT_ON_HAND_SHAKE);
LogMsg(msg);
}
void LogOnClose(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CLOSE, 0, nullptr, lpszName);
LogInfoMsg(msg);
}
void PostOnSend(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[20];
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_SEND, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnSendTo(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pData, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("<%s#%d> (%d bytes)"), lpszAddress, usPort, iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_SEND, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnReceive(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[20];
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_RECEIVE, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnReceiveFrom(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pData, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("<%s#%d> (%d bytes)"), lpszAddress, usPort, iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_RECEIVE, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnReceiveCast(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pData, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("<%s#%d> (%d bytes)"), lpszAddress, usPort, iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_RECEIVE, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnClose(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CLOSE, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostOnError(CONNID dwConnID, int enOperation, int iErrorCode, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("OP: %d, CODE: %d"), enOperation, iErrorCode);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ERROR, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnError2(CONNID dwConnID, int enOperation, int iErrorCode, LPCTSTR lpszAddress, USHORT usPort, const BYTE* pBuffer, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[150];
wsprintf(lpszContent, _T("<%s#%d> OP: %d, CODE: %d (DATA: 0x%X, LEN: %d>"), lpszAddress, usPort, enOperation, iErrorCode, pBuffer, iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ERROR, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnAccept(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, BOOL bPass, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("%s (%s#%d)"), bPass ? _T("PASS") : _T("REJECT"), lpszAddress, usPort);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ACCEPT, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnAccept2(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_ACCEPT, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostOnHandShake(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_HAND_SHAKE, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostOnPrepareListen(LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("bind address: %s#%d"), lpszAddress, usPort);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(0, EVT_ON_PREPARE_LISTEN, content_len, lpszContent, lpszName);
LogInfoMsg(msg);
}
void PostOnPrepareConnect(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_PREPARE_CONNECT, 0, nullptr, lpszName);
LogInfoMsg(msg);
}
void PostOnConnect(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("local address: %s#%d"), lpszAddress, usPort);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnConnect2(CONNID dwConnID, LPCTSTR lpszAddress, USHORT usPort, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("remote address: %s#%d"), lpszAddress, usPort);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnConnect3(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CONNECT, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostOnShutdown(LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(0, EVT_ON_SHUTDOWN, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostServerStatics(const LONGLONG& llTotalSent, const LONGLONG& llTotalReceived, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("*** Summary: send - %lld, recv - %lld ***"), llTotalSent, llTotalReceived);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(0, EVT_ON_END_TEST, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostServerTemporaryStatics(const LONGLONG& llTotalSent, const LONGLONG& llTotalReceived, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("*** Summary: send - %lld, recv - %lld ***"), llTotalSent, llTotalReceived);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(0, EVT_ON_STAT_TEST, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostTimeConsuming(DWORD dwTickCount, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("Total Time Consuming: %u"), dwTickCount);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(0, EVT_ON_END_TEST, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
#ifdef _NEED_HTTP
void PostOnMessageBegin(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_MESSAGE_BEGIN, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostOnRequestLine(CONNID dwConnID, LPCSTR lpszMethod, USHORT usUrlFieldSet, LPCSTR lpszUrl, LPCTSTR lpszName)
{
USES_CONVERSION;
int content_len = (int)(strlen(lpszMethod) + strlen(lpszUrl) + 20);
LPTSTR lpszContent = new TCHAR[content_len];
wsprintf(lpszContent, _T("[%s/0x%02X] : %s"), A2T(lpszMethod), usUrlFieldSet, A2T(lpszUrl));
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_REQUEST_LINE, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnStatusLine(CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc, LPCTSTR lpszName)
{
USES_CONVERSION;
int content_len = (int)(strlen(lpszDesc) + 10);
LPTSTR lpszContent = new TCHAR[content_len];
wsprintf(lpszContent, _T("(%u) : %s"), usStatusCode, A2T(lpszDesc));
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_STATUS_LINE, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnHeader(CONNID dwConnID, LPCSTR lpszHeaderName, LPCSTR lpszHeaderValue, LPCTSTR lpszName)
{
USES_CONVERSION;
int content_len = (int)(strlen(lpszHeaderName) + strlen(lpszHeaderValue) + 10);
LPTSTR lpszContent = new TCHAR[content_len];
wsprintf(lpszContent, _T("%s: %s"), A2T(lpszHeaderName), A2T(lpszHeaderValue));
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_HEADER, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnHeadersComplete(CONNID dwConnID, LPCSTR lpszSummary, LPCTSTR lpszName)
{
USES_CONVERSION;
static LPCTSTR PREFIX = _T("* * * * * * * * * Summary * * * * * * * * *\r\n");
static int PREFIX_LEN = lstrlen(PREFIX);
LPCTSTR lpszSummaryT = A2CT(lpszSummary);
int content_len = lstrlen(lpszSummaryT) + PREFIX_LEN + 1;
LPTSTR lpszContent = new TCHAR[content_len];
memcpy(lpszContent, PREFIX, PREFIX_LEN * sizeof(TCHAR));
memcpy(lpszContent + PREFIX_LEN, lpszSummaryT, (content_len - PREFIX_LEN) * sizeof(TCHAR));
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_HEADERS_COMPLETE, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnBody(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[20];
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_BODY, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnChunkHeader(CONNID dwConnID, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[20];
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CHUNK_HEADER, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnChunkComplete(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_CHUNK_COMPLETE, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostOnMessageComplete(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_MESSAGE_COMPLETE, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostOnUpgrade(CONNID dwConnID, EnHttpUpgradeType enUpgradeType, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[20];
wsprintf(lpszContent, _T("(type: %d)"), enUpgradeType);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_UPGRADE, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnParseError(CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc, LPCTSTR lpszName)
{
USES_CONVERSION;
int content_len = (int)(strlen(lpszErrorDesc) + 10);
LPTSTR lpszContent = new TCHAR[content_len];
wsprintf(lpszContent, _T("(%i) : %s"), iErrorCode, A2T(lpszErrorDesc));
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_PARSE_ERROR, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnWSMessageHeader(CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[100];
wsprintf(lpszContent, _T("(fin: %d, rsv: 0x%x, oc: 0x%x, mask: %d, len: %lld)"), bFinal, iReserved, iOperationCode, lpszMask ? 1 : 0, ullBodyLen);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_WS_MSG_HEADER, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnWSMessageBody(CONNID dwConnID, const BYTE* pData, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[20];
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_WS_MSG_BODY, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostOnWSMessageComplete(CONNID dwConnID, LPCTSTR lpszName)
{
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_WS_MSG_COMPLETE, 0, nullptr, lpszName);
PostInfoMsg(msg);
}
void PostUncompressBody(CONNID dwConnID, int iLength, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[40];
wsprintf(lpszContent, _T("(%d bytes)"), iLength);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_UNCOMPRESS_BODY, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
void PostUncompressBodyFail(CONNID dwConnID, int iResult, LPCTSTR lpszName)
{
LPTSTR lpszContent = new TCHAR[40];
wsprintf(lpszContent, _T("(rs: %d)"), iResult);
int content_len = lstrlen(lpszContent);
info_msg* msg = info_msg::Construct(dwConnID, EVT_ON_UNCOMPRESS_BODY_FAIL, content_len, lpszContent, lpszName);
PostInfoMsg(msg);
}
#endif
void PostInfoMsg(info_msg* msg)
{
LogInfoMsg(msg);
}
void LogInfoMsg(info_msg* pInfoMsg)
{
CString msg;
if(pInfoMsg->name)
{
if(pInfoMsg->connID > 0)
{
if(pInfoMsg->contentLength > 0)
msg.Format(_T("[ %s #%zu, %s ] -> %s"), pInfoMsg->name, pInfoMsg->connID, pInfoMsg->evt, pInfoMsg->content);
else
msg.Format(_T("[ %s #%zu, %s ]"), pInfoMsg->name, pInfoMsg->connID, pInfoMsg->evt);
}
else
{
if(pInfoMsg->contentLength > 0)
msg.Format(_T("[ %s - %s ] -> %s"), pInfoMsg->name, pInfoMsg->evt, pInfoMsg->content);
else
msg.Format(_T("[ %s - %s ]"), pInfoMsg->name, pInfoMsg->evt);
}
}
else
{
if(pInfoMsg->connID > 0)
{
if(pInfoMsg->contentLength > 0)
msg.Format(_T("[ %zu, %s ] -> %s"), pInfoMsg->connID, pInfoMsg->evt, pInfoMsg->content);
else
msg.Format(_T("[ %zu, %s ]"), pInfoMsg->connID, pInfoMsg->evt);
}
else
{
if(pInfoMsg->contentLength > 0)
msg.Format(_T("[ %s ] -> %s"), pInfoMsg->evt, pInfoMsg->content);
else
msg.Format(_T("[ %s ]"), pInfoMsg->evt);
}
}
LogMsg(msg);
info_msg::Destruct(pInfoMsg);
}
void LogMsg(const CString& msg)
{
puts(msg);
}
BOOL SplitStr(LPCTSTR lpszSrc, vector<CString>& vtItem, LPCTSTR pszSepectors, LPCTSTR pszQMarks)
{
vtItem.clear();
CString strQMarks = pszQMarks;
CString strSepectors = pszSepectors;
if(strSepectors.IsEmpty())
strSepectors = _T(" ");
if(!strQMarks.IsEmpty())
if(strQMarks.FindOneOf(strSepectors) != -1)
return FALSE;
BOOL bRetVal = TRUE;
CString strSrc = lpszSrc;
while(!strSrc.Trim(strSepectors).IsEmpty())
{
CString strItem;
int iSrcLen = strSrc.GetLength();
int iPos1 = strSrc.FindOneOf(strSepectors);
int iPos2 = !strQMarks.IsEmpty() ? strSrc.FindOneOf(strQMarks) : -1;
int iPos3 = -1;
if(iPos1 == -1 && iPos2 == -1)
strItem = strSrc;
else if(iPos1 != -1 && (iPos1 < iPos2 || iPos2 == -1))
strItem = strSrc.Left(iPos1);
else // (iPos1 > iPos2 || iPos1 == -1)
{
TCHAR tc = strSrc[iPos2];
iPos3 = strSrc.Find(tc, iPos2 + 1);
if(iPos3 != -1)
strItem = strSrc.Mid(iPos2 + 1, iPos3 - iPos2 - 1);
else
{
vtItem.clear();
bRetVal = FALSE;
break;
}
}
vtItem.push_back(strItem);
strSrc = strSrc.Right(iPos3 == -1 ? (iSrcLen - (iPos1 == -1 ? strItem.GetLength() : iPos1 + 1)) : (iSrcLen - iPos3 - 1));
}
return bRetVal;
}
sa_family_t GuessAddrFamily(LPCTSTR lpszAddress)
{
if (!lpszAddress || lpszAddress[0] == 0)
return AF_UNSPEC;
if(::StrChr(lpszAddress, ':'))
return AF_INET6;
TCHAR c;
int arr[4];
if(stscanf(lpszAddress, _T("%d.%d.%d.%d%c"), &arr[0], &arr[1], &arr[2], &arr[3], &c) != 4)
return AF_UNSPEC;
for(int i = 0; i < 4; i++)
{
if(arr[i] < 0 || arr[i] > 255)
return AF_UNSPEC;
}
return AF_INET;
}
CBufferPtr* GeneratePkgBuffer(DWORD seq, LPCTSTR lpszName, short age, LPCTSTR lpszDesc)
{
USES_CONVERSION;
LPCSTR name = T2A((LPTSTR)lpszName);
LPCSTR desc = T2A((LPTSTR)lpszDesc);
int desc_len = (int)strlen(desc) + 1;
int body_len = (int)offsetof(TPkgBody, desc) + desc_len;
TPkgBody* pBody = (TPkgBody*)alloca(body_len);
memset(pBody, 0, body_len);
pBody->age = age;
strcpy(pBody->name, name);
strcpy(pBody->desc, desc);
TPkgHeader header;
header.seq = seq;
header.body_len = body_len;
return GeneratePkgBuffer(header, *pBody);
}
CBufferPtr* GeneratePkgBuffer(const TPkgHeader& header, const TPkgBody& body)
{
int header_len = sizeof(TPkgHeader);
int body_len = header.body_len;
CBufferPtr* pBuffer = new CBufferPtr(header_len + body_len);
memcpy(pBuffer->Ptr(), (BYTE*)&header, header_len);
memcpy(pBuffer->Ptr() + header_len, (BYTE*)&body, body_len);
return pBuffer;
}
LPCTSTR GetLoopbackAddress(LPCTSTR lpszLikeAddress)
{
sa_family_t f = GuessAddrFamily(lpszLikeAddress);
if(f == AF_INET)
return IPV4_LOOPBACK_ADDRESS;
if(f == AF_INET6)
return IPV6_LOOPBACK_ADDRESS;
return nullptr;
}
LPCTSTR GetAnyAddress(LPCTSTR lpszLikeAddress)
{
sa_family_t f = GuessAddrFamily(lpszLikeAddress);
if(f == AF_INET)
return IPV4_ANY_ADDRESS;
if(f == AF_INET6)
return IPV6_ANY_ADDRESS;
return nullptr;
}
LPCTSTR g_lpszDefaultCookieFile = GetDefaultCookieFile();
LPCTSTR GetDefaultCookieFile()
{
static TCHAR c_szCookieFile[MAX_PATH] = {0};
if(c_szCookieFile[0] == 0)
{
CString strName = ::GetModuleFileName();
ASSERT(!strName.IsEmpty());
strName.Append(".cki");
lstrcpy(c_szCookieFile, strName);
}
return c_szCookieFile;
}
#ifdef _NEED_SSL
#include "../../src/common/FuncHelper.h"
#define SSL_CERT_RELATIVE_PATH_1 _T("/hp-ssl-cert/")
#define SSL_CERT_RELATIVE_PATH_2 _T("/../../ssl-cert/")
LPCSTR g_c_lpszPemCert =
"-----BEGIN CERTIFICATE-----\n"
"MIIDszCCApugAwIBAgIBATANBgkqhkiG9w0BAQsFADB7MQswCQYDVQQGEwJDTjEL\n"
"MAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQwwCgYDVQQKDANTU1QxDzANBgNVBAsM\n"
"Bkplc3NtYTETMBEGA1UEAwwKamVzc21hLm9yZzEeMBwGCSqGSIb3DQEJARYPbGRj\n"
"c2FhQDIxY24uY29tMCAXDTI0MDYyNjA1MjUwOFoYDzIyNDMwNzA5MDUyNTA4WjBu\n"
"MQswCQYDVQQGEwJDTjELMAkGA1UECAwCR0QxDDAKBgNVBAoMA1NTVDEPMA0GA1UE\n"
"CwwGSmVzc21hMRMwEQYDVQQDDApqZXNzbWEub3JnMR4wHAYJKoZIhvcNAQkBFg9s\n"
"ZGNzYWFAMjFjbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCD\n"
"+MyrJEKCheRoOpMRjR78S8hr9W7XN0/EZWyVKwXRT7EE0aGiQdH/W2a+qpWRMa6E\n"
"Qi47zdBnt0P8ZoFiItQhuhwUJ064afpVoaHHX25UdbF8r+sRTofadughETBBj2Cf\n"
"qh0ia6EOB0QvpJpywWmGZPoMtypjbUiTb/YGOJh2qsVr67MN/E48vt7qt0VxF9SE\n"
"pucvqhraTBljWCeRVCae2c0yBSpq/n+7NhamK7+g3xxCKWRz4pN3wrIoEsXTboTh\n"
"z940caDgthCc23VJ080DN44jZg6c87huKIuxbebJqw2HCM4DwrW+OSzTLszpFAXZ\n"
"yarllOzWnBut20zmYnl1AgMBAAGjTTBLMAkGA1UdEwQCMAAwHQYDVR0OBBYEFJ5E\n"
"RJmJ4pUzEbcU9Yge6nr0oi51MB8GA1UdIwQYMBaAFN49z48DywmoD4cNTQgC6nn2\n"
"QJoUMA0GCSqGSIb3DQEBCwUAA4IBAQBpoSFfDDDKMAy95tSROpYu5WSWQXe6B7kl\n"
"PGJAF6mWe/4b7jHQqDUVkEmFmbMWUAtpTC3P01TrV77dhIosAnC/B76fb7Pto8W4\n"
"cjGpWAT0sSegZuhnLtguTGlnR0vVSh/yRRDEtjN8loWpu3BLWVHYOKnn62QGfY0B\n"
"sRGrfZsKvwB+1w+HOvGopnWv6UYwrzEKthjPMR65rOsoManOv24ua8baJmq0gqF9\n"
"752kD8n703uWUBx79/QlNIPMZC1iUIi1mEjyrTgSag6+3sWAIKihaoF/Nf9d01nw\n"
"iL16EIT5dJ0QJWDCeIxhuTZckw+gL1pBeQU7pqzKHPnvo+8GBnTG\n"
"-----END CERTIFICATE-----\n";
LPCSTR g_c_lpszPemKey =
"-----BEGIN ENCRYPTED PRIVATE KEY-----\n"
"MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIK2UJW9QXIj4CAggA\n"
"MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBCDDZQLhAdT91jd6v/5H0+GBIIE\n"
"0PH6tKl+nPi8sU0ryjxDIrHwrT/ZFah+3TAHGE/YFAOZnzRyCFHQTvUZX4p8eSmw\n"
"WOpt5NBUPJ3mT0Ctt7lGBRy4AXSyBrFSamlTruM3P1e3ijluYjMbweZFfCWPq8c/\n"
"jPjbcUkXe6mD96aPSTt/jIunexS8AKovu8c/bFLyTLDk38lATc+GnXQQJ0KiXCRu\n"
"vpjVSKcv2Br6cWqaNTZ71FvH1RmSD6K6givc0w65pKruHYTMApIRR8YC5Y0vx0gD\n"
"6nS12LV/EJEtxTfZFlrzZTRWZISPIzYGuTfS+3bPePlxpbwzhN6vmvgjKhdk+3lN\n"
"3W3ZfqODNhoOKG+mG5Fdj7vR2PU1UND6UUd3+FrzWkXikmalAAwKzRLnyTR1T2rl\n"
"RhM0Qe/HZianeEQTHpCw27gOz1OMw2EKfIEHM6W2BKGOTY5ls5dqgMfP1ZoQUrOr\n"
"59tJo4GpWYFGCuHhTEa5OS/gsgnzymGrkuEwPsdSQaBdzV7lFGTv2/ryKX+vNm9V\n"
"CmKw0nHzOVP19+WL4vPDtbRnLUk8KV9Mg7PdSbGbNcMmTEBk8ju8OvjIUIWZbRTa\n"
"n5C6fhD1DYZcczmlCILYgXyJISu7EDf3z9cKRAf5VbRAedDMB/xHWmrmlxUJ37Kt\n"
"tVgaCD0U6Q3q+3y6OOwugc8UbSo4yA/DbLlG0/U7afwQaNxTLa4HGBQljpoNStIt\n"
"Vgfy2olqHXaf2doSQtsYEl9MHa6neuGfZQMtonDkejnx4KKU+cMhe+KijEUwieYx\n"
"7aoPB71b82XODquDPAL5zOegj0eYgKn5iXyOx5W44S34zfclxtxxgfsDJ3qJ9qoL\n"
"sSenrQ3xAYHJSZRcqEgO31XhoEnkyt1V7G0Bk4/GUMD6uQudr3nsw/ulJpAlNK15\n"
"ZxTSKWrtwOWdwcTj6B14K6wcqMFVNF1Ydbv/qp0b5q5S/orYHzRIPcFmdOAIsjyO\n"
"6na7+D31BH/4pf+TASBNqRNRw5CBqNcGcfiXk11AywxUnmD5ZvC/C0pTpTD/9qC4\n"
"LucWJ0sNAtPq8suFjKqQ+wMvq3rUh050NRm2cm2nUJLxafTnr0v3+kKYbVW8pSWB\n"
"NMelZMVGF1MDYBujg8Mw/xuMhPeLozCZeKmo7eu7aDMXzQMZLfAEJAzU9Du8H4nq\n"
"GgQVUgEkS5rdbjZGkHP0FuM8m8lueKEPDYwHCJv9Be5Z/uxp9OO/Lmdlha0J7gJu\n"
"pihNkAYVxRst96b5okXKooYi/TZxAdThoPYH28VwinGR1I3/8I3M5DbUPIgHhDeB\n"
"ga3u7jt7ZNDUgavukUD0S7WioRb5ooXrXGZ1xmzKLCmMdCDC5S32fQS0wRGfVoMl\n"
"hWbaT+0uak+fOpqVRxSNyE3Ek788ua5iPHaTSXJSoe5lv7OQKDSZ/+wFeLmDPf4M\n"
"BHL2gBLD6RNkz5cWgy14sQcJKNAnyptU4EGPyURZcB8APtB/ITAS2Az/JSxvSBgq\n"
"g/L1FujnP2QEpWpVKkTNxsF867bUPN34KrlPKYjNqcKA2pD4fkFoKSeeNtOEWa++\n"
"d6q9y+mDD97SnIFAAhDFlukzXtyl4MU6uiqRldFiuEt3KzvV19n8M+NyyYIFhfdg\n"
"6TkYEbMJPQ/Y3EGNmyMqbFdJzrdl/B8pr7JQnikTfUZZ\n"
"-----END ENCRYPTED PRIVATE KEY-----\n";
LPCSTR g_c_lpszCAPemCert =
"-----BEGIN CERTIFICATE-----\n"
"MIID2TCCAsGgAwIBAgIUM8TTtPU+ejzffYXCcs/zZsU7OuIwDQYJKoZIhvcNAQEL\n"
"BQAwezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEMMAoG\n"
"A1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNVBAMMCmplc3NtYS5vcmcx\n"
"HjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTAgFw0yNDA2MjYwNTA0NDNa\n"
"GA8yMjcwMTEyNDA1MDQ0M1owezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQsw\n"
"CQYDVQQHDAJHWjEMMAoGA1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNV\n"
"BAMMCmplc3NtYS5vcmcxHjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTCC\n"
"ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAML+v79+aLQt0Za0dTIZHI5B\n"
"NDs0g5G8bhdOTlW/kNWflaziZ3GY6d6nJSkQ5e29kyFKxlOD6Gls6bOJ86U71u4R\n"
"bCmoFvRTDH4q2cJ/+PbiioLpNveDG6lnRCs9JNRQoJrkpRo6urnVnAdsIf6UFjLI\n"
"dlByNMPGYJ0V8/oKJG5Vu5gcbZV0jVA5+tswkH/zquexEXoKvp18mcwl+pNc/LwW\n"
"0WnGj0uoJjxHg4GsS78PASjhxMR/2d/1OpgPauldFaNHjVPtaLqJnuejwA6M6Sz8\n"
"iFPybAQAMpHL9W8kf08jtbnFvnm4ibUkQL5h+OJoIEQa9AVZOSoFG2/g5Zcn8X8C\n"
"AwEAAaNTMFEwHQYDVR0OBBYEFN49z48DywmoD4cNTQgC6nn2QJoUMB8GA1UdIwQY\n"
"MBaAFN49z48DywmoD4cNTQgC6nn2QJoUMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI\n"
"hvcNAQELBQADggEBALJnYrYBSZLyYX14FQ04zxG3AX0CtQzNOOa7LDrr+H8Ly+nK\n"
"qS87gg2njMVZH1zM2demtMwydR/F2Ui8ggaduMvc9h5YgQKEwYl8KarJEY03oZoe\n"
"zbQGBxCXpDOtMs1vujzcl/iZbSzwEDF3g4la5U8q4MlmfGFKz9CJbvoxecqYA206\n"
"nNbW2XZsW/xMiQv6iAw5iP/LOR9HAyxcvXIsL790nfcgnTYLmyP254Dj4outc6R+\n"
"PA+f/c1FvkbUBTR5vJt2tsvHcNU218rY2hyOIhDmZeUWprqBO19sUk3scLbVPr3+\n"
"WEWEl2XaCekKuPtAnMgVQuFsocXGyiuIhkOe5Z4=\n"
"-----END CERTIFICATE-----\n";
LPCSTR g_s_lpszPemCert =
"-----BEGIN CERTIFICATE-----\n"
"MIIEJjCCAw6gAwIBAgIBAzANBgkqhkiG9w0BAQsFADB7MQswCQYDVQQGEwJDTjEL\n"
"MAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQwwCgYDVQQKDANTU1QxDzANBgNVBAsM\n"
"Bkplc3NtYTETMBEGA1UEAwwKamVzc21hLm9yZzEeMBwGCSqGSIb3DQEJARYPbGRj\n"
"c2FhQDIxY24uY29tMCAXDTI0MDYyNjA1MTY1NFoYDzIyNDMwNzA5MDUxNjU0WjBu\n"
"MQswCQYDVQQGEwJDTjELMAkGA1UECAwCR0QxDDAKBgNVBAoMA1NTVDEPMA0GA1UE\n"
"CwwGSmVzc21hMRMwEQYDVQQDDApqZXNzbWEub3JnMR4wHAYJKoZIhvcNAQkBFg9s\n"
"ZGNzYWFAMjFjbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7\n"
"x3ilLjZtH2ZKuofj4FpVl/IF2yDI5503YQbwllxp7kNEaqTyjJUgmLlZBbwHQzTD\n"
"xfPk/nZ/m3xUHsVjwXMZqNNufgtSLaBoK4CvBAOTkELphIOZdJYPpuaU66W0phjG\n"
"VM2R4EFm/rTXddZ7N6sq3fYEL0bxqUJ6fW/+0QhdNSwfdevdAHgOmGkrTj5rILJ8\n"
"A7FwbkcuV5vBWZ+9ZhNG4csqAjH5LLLCn5hJdhE9WqUp+slfIuXE5vZGDpCQrcc5\n"
"I1qWt8VNfdwzaBDL/hXl7pAiVpZRvQxyJgbUMLr2QrYFwrPkgpncU7R7AyT/C0tO\n"
"vgPVZb+IGqbf+NrbHEk3AgMBAAGjgb8wgbwwHwYDVR0jBBgwFoAU3j3PjwPLCagP\n"
"hw1NCALqefZAmhQwCQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwYgYDVR0RBFswWYIJ\n"
"bG9jYWxob3N0ggpqZXNzbWEub3JnggwqLmplc3NtYS5vcmeCCmplc3NtYS5jb22C\n"
"DCouamVzc21hLmNvbYIKamVzc21hLm5ldIIMKi5qZXNzbWEubmV0MB0GA1UdDgQW\n"
"BBRZ97VSkfue5s8/OkYvUe+lXUgsHzANBgkqhkiG9w0BAQsFAAOCAQEAvM1QrhTL\n"
"/I1ws4fozKQlfmd3S0AdfFJX4BMTbp88proWpjrNZt6ZJ3EETHKcXu0z4gn3jWy6\n"
"1d8bDCytYQXjpG3Na7Ym5jc/E7wc+XUCUxlW41G/HnaLaIVccmRbyxMOWkr3yUX1\n"
"tc8rxUSKWzZBmYtJ49QzIvNzDuoLklE44g8XuqsZZlOZ2wRWJxc/hDG0MkKhRnc1\n"
"mqeaoY/79QZNE1RvX/aRRJoSl7NQ00/rMP8MU6OMzPvbIsMVK2uT+BVZG0RZJXaG\n"
"ikQJvxYZrDVZdRZL6tWPtS2wI49KkzGHNH4S1Fni/dDq3P2rxzisMY1gtKQLeVYY\n"
"eTQDDybjTWWiTg==\n"
"-----END CERTIFICATE-----\n";
LPCSTR g_s_lpszPemKey =
"-----BEGIN ENCRYPTED PRIVATE KEY-----\n"
"MIIFHTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIgAqUxS2ufB0CAggA\n"
"MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBD8E9f397mpmzmM9zYTWt2DBIIE\n"
"wIo2i0YH7cT/WCLmSnVvpsbayeo0mbVUFS4xp2VerQUS+UXHlrrOFeKU8NYfG6SS\n"
"m+3PXksvUlDV9iGT0p/w2Fm1GVKhE7UAeTJkff7KWi2pc926DUbYxhFOUNyCnrQS\n"
"pWCdV6M/243A0kHg6kIlSblsXjzKMC6eSlh2FGa7M7my9A+nu0WGOqvazkOm/8jk\n"
"h20xmB3t/Qa8NQp59E9oLXs5+CokIKL17+PmtBKeKpQBxAUtFjcqRAugIiNpPjOS\n"
"K99cY/Tt1C8ugMIsFH1/4HzFDYiSDRZ630dKOzBruprHVkIvQXI1CW6edPlfFZKG\n"
"yHeH95kigPVWUxWwluwALVmlPwD4h/GWHGOS7HH6x4ubStogjmC2B9f4VQCd6YRu\n"
"lee3cdDvdqLoRCoU48SoM/+RMR3NpF508ulWhKrDZ4eGcqdUYrx3rWVyOrmfMJDe\n"
"kfckGKnhCA1hL3wb/HQuAs2st2lDKBwsYIsOc8UXhueRFHKk+W0O/5kureMPF14O\n"
"DAxqAW3meHq7CLY8WuqatptIrJVDT8Wkbx47tXhLapTwlI0Cbf2AGfJIWSGmM+VF\n"
"I5l13pW2tycQnAXzSdd0y9wE0df/EoyXfIJeEfBNkzVhkIIC3KmOiI8BCnei6UR9\n"
"jun4+6aeFyfGybJ04ybixXyFsCsVUa5QcnhPwJvC8QsVFpuzOttQ5cf4Xn57DyxT\n"
"4CzWieJ6iQpfAJahRcj/4O6KRmWuMPpkK8XsCgzOYM1MxETq4HbqXEp68KiT6Q9r\n"
"jEAmbfZ8NdPvAPZ/iXKtA/eaMDDy6EbzDscUBg/TSxsF286F+wH2kXvkbwL2E/zh\n"
"LsTcjsGUdNKxlDJaivi7dDbSzxzvcDYRh+8Bd/vOw2gJF2ohwXXp3GKTVu71LS+b\n"
"YruQ55Lauh761ziI/z7qZw9ko8erb5vcsqLh9duqtxTBnQEd05ufFhNnXk4Vq8Cp\n"
"hr30Qy5sJ7TUuAVs2RSuGHd0Q5l8NGLjQwtkDx5ofizZKQOMWTq8S3IA98QyFka0\n"
"e+XaGGQ/KZJciIoCkuzAX4mn/aIffMldQIEg5ybslBc326SdTe52ex5YlmUuyvbO\n"
"zDotjC/eeQEFvq6Xb14N+u7mp8xL5Dlro79aL3VNNGa3lgKP6lWtMjgcyZrWMdc4\n"
"xaV0sVbfRO8Pj4y3cZGXol529zSNSIc7wT2/kyvF6RgJEcluAIPAJ8ea6CXKqDfe\n"
"sYZDL1emVoKMoFy3YsnEI+py2xxSsU4pjGPanZZaVfrDfw3qnQWPovfOx5fVc6Om\n"
"U55o3nbR5wtjPlQmcdVlT/fo7m/OUu3UgdjyLFcljeezJGeskJ3PMYbSsi7Mf+yF\n"
"/BEW6IfqicjG9TTMGzNACHH0iqAzW6lrC60UXMRIXrs/segt3+r5JqfRH58TMBR+\n"
"O5xk6sjOL4uqTsJRmbMapHf4tPxli8PdvNYN+YTQ4tlwazrckwgC5TJ3GA5JM3Ox\n"
"ZQIIKf1joemxq/VT2IpsqwMY67KC4OUOiRy471guGdljFarACe8rzZh8BHONveJd\n"
"XDgM0oPBkR9z4BGlfbBgAG0bIRNSXp8yGaZMiuIHbI8I4TnR84KgyUUscsIlH03A\n"
"8PQL73vd5pU4jC6WdOaXwkI=\n"
"-----END ENCRYPTED PRIVATE KEY-----\n";
LPCSTR g_s_lpszCAPemCert =
"-----BEGIN CERTIFICATE-----\n"
"MIID2TCCAsGgAwIBAgIUM8TTtPU+ejzffYXCcs/zZsU7OuIwDQYJKoZIhvcNAQEL\n"
"BQAwezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEMMAoG\n"
"A1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNVBAMMCmplc3NtYS5vcmcx\n"
"HjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTAgFw0yNDA2MjYwNTA0NDNa\n"
"GA8yMjcwMTEyNDA1MDQ0M1owezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQsw\n"
"CQYDVQQHDAJHWjEMMAoGA1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNV\n"
"BAMMCmplc3NtYS5vcmcxHjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTCC\n"
"ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAML+v79+aLQt0Za0dTIZHI5B\n"
"NDs0g5G8bhdOTlW/kNWflaziZ3GY6d6nJSkQ5e29kyFKxlOD6Gls6bOJ86U71u4R\n"
"bCmoFvRTDH4q2cJ/+PbiioLpNveDG6lnRCs9JNRQoJrkpRo6urnVnAdsIf6UFjLI\n"
"dlByNMPGYJ0V8/oKJG5Vu5gcbZV0jVA5+tswkH/zquexEXoKvp18mcwl+pNc/LwW\n"
"0WnGj0uoJjxHg4GsS78PASjhxMR/2d/1OpgPauldFaNHjVPtaLqJnuejwA6M6Sz8\n"
"iFPybAQAMpHL9W8kf08jtbnFvnm4ibUkQL5h+OJoIEQa9AVZOSoFG2/g5Zcn8X8C\n"
"AwEAAaNTMFEwHQYDVR0OBBYEFN49z48DywmoD4cNTQgC6nn2QJoUMB8GA1UdIwQY\n"
"MBaAFN49z48DywmoD4cNTQgC6nn2QJoUMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI\n"
"hvcNAQELBQADggEBALJnYrYBSZLyYX14FQ04zxG3AX0CtQzNOOa7LDrr+H8Ly+nK\n"
"qS87gg2njMVZH1zM2demtMwydR/F2Ui8ggaduMvc9h5YgQKEwYl8KarJEY03oZoe\n"
"zbQGBxCXpDOtMs1vujzcl/iZbSzwEDF3g4la5U8q4MlmfGFKz9CJbvoxecqYA206\n"
"nNbW2XZsW/xMiQv6iAw5iP/LOR9HAyxcvXIsL790nfcgnTYLmyP254Dj4outc6R+\n"
"PA+f/c1FvkbUBTR5vJt2tsvHcNU218rY2hyOIhDmZeUWprqBO19sUk3scLbVPr3+\n"
"WEWEl2XaCekKuPtAnMgVQuFsocXGyiuIhkOe5Z4=\n"
"-----END CERTIFICATE-----\n";
CString g_c_strCAPemCertFileOrPath;
CString g_c_strPemCertFile;
CString g_c_strPemKeyFile;
CString g_s_strCAPemCertFileOrPath;
CString g_s_strPemCertFile;
CString g_s_strPemKeyFile;
int g_c_iVerifyMode = SSL_VM_PEER;
LPCTSTR g_c_lpszCAPemCertFileOrPath = _T("ca.crt");
LPCTSTR g_c_lpszPemCertFile = _T("client.cer");
LPCTSTR g_c_lpszPemKeyFile = _T("client.key");
LPCTSTR g_c_lpszKeyPasswod = _T("123456");
int g_s_iVerifyMode = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT;
LPCTSTR g_s_lpszCAPemCertFileOrPath = _T("ca.crt");
LPCTSTR g_s_lpszPemCertFile = _T("server.cer");
LPCTSTR g_s_lpszPemKeyFile = _T("server.key");
LPCTSTR g_s_lpszKeyPasswod = _T("123456");
CString g_c_strCAPemCertFileOrPath2;
CString g_c_strPemCertFile2;
CString g_c_strPemKeyFile2;
CString g_s_strCAPemCertFileOrPath2;
CString g_s_strPemCertFile2;
CString g_s_strPemKeyFile2;
int g_c_iVerifyMode2 = SSL_VM_PEER;
LPCTSTR g_c_lpszCAPemCertFileOrPath2 = _T("ca2.crt");
LPCTSTR g_c_lpszPemCertFile2 = _T("client2.cer");
LPCTSTR g_c_lpszPemKeyFile2 = _T("client2.key");
LPCTSTR g_c_lpszKeyPasswod2 = _T("123456");
int g_s_iVerifyMode2 = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT;
LPCTSTR g_s_lpszCAPemCertFileOrPath2 = _T("ca2.crt");
LPCTSTR g_s_lpszPemCertFile2 = _T("server2.cer");
LPCTSTR g_s_lpszPemKeyFile2 = _T("server2.key");
LPCTSTR g_s_lpszKeyPasswod2 = _T("123456");
BOOL InitSSLParams();
BOOL g_SSLParams = InitSSLParams();
BOOL InitSSLParams()
{
::SetCurrentPathToModulePath();
CString strCur = ::GetCurrentDirectory();
CString strPath = strCur + SSL_CERT_RELATIVE_PATH_1;
if(!CFile::IsDirectory(strPath))
strPath = strCur + SSL_CERT_RELATIVE_PATH_2;
if(g_c_lpszPemCertFile)
{
g_c_strPemCertFile = strPath + g_c_lpszPemCertFile;
g_c_lpszPemCertFile = g_c_strPemCertFile;
}
if(g_c_lpszPemKeyFile)
{
g_c_strPemKeyFile = strPath + g_c_lpszPemKeyFile;
g_c_lpszPemKeyFile = g_c_strPemKeyFile;
}
if(g_c_lpszCAPemCertFileOrPath)
{
g_c_strCAPemCertFileOrPath = strPath + g_c_lpszCAPemCertFileOrPath;
g_c_lpszCAPemCertFileOrPath = g_c_strCAPemCertFileOrPath;
}
if(g_s_lpszPemCertFile)
{
g_s_strPemCertFile = strPath + g_s_lpszPemCertFile;
g_s_lpszPemCertFile = g_s_strPemCertFile;
}
if(g_s_lpszPemKeyFile)
{
g_s_strPemKeyFile = strPath + g_s_lpszPemKeyFile;
g_s_lpszPemKeyFile = g_s_strPemKeyFile;
}
if(g_s_lpszCAPemCertFileOrPath)
{
g_s_strCAPemCertFileOrPath = strPath + g_s_lpszCAPemCertFileOrPath;
g_s_lpszCAPemCertFileOrPath = g_s_strCAPemCertFileOrPath;
}
if(g_c_lpszPemCertFile2)
{
g_c_strPemCertFile2 = strPath + g_c_lpszPemCertFile2;
g_c_lpszPemCertFile2 = g_c_strPemCertFile2;
}
if(g_c_lpszPemKeyFile2)
{
g_c_strPemKeyFile2 = strPath + g_c_lpszPemKeyFile2;
g_c_lpszPemKeyFile2 = g_c_strPemKeyFile2;
}
if(g_c_lpszCAPemCertFileOrPath2)
{
g_c_strCAPemCertFileOrPath2 = strPath + g_c_lpszCAPemCertFileOrPath2;
g_c_lpszCAPemCertFileOrPath2 = g_c_strCAPemCertFileOrPath2;
}
if(g_s_lpszPemCertFile2)
{
g_s_strPemCertFile2 = strPath + g_s_lpszPemCertFile2;
g_s_lpszPemCertFile2 = g_s_strPemCertFile2;
}
if(g_s_lpszPemKeyFile2)
{
g_s_strPemKeyFile2 = strPath + g_s_lpszPemKeyFile2;
g_s_lpszPemKeyFile2 = g_s_strPemKeyFile2;
}
if(g_s_lpszCAPemCertFileOrPath2)
{
g_s_strCAPemCertFileOrPath2 = strPath + g_s_lpszCAPemCertFileOrPath2;
g_s_lpszCAPemCertFileOrPath2 = g_s_strCAPemCertFileOrPath2;
}
return TRUE;
}
#endif
#ifdef _NEED_HTTP
LPCSTR HTTP_WEB_SOCKET_CLOSE_FLAG = "$close";
const BYTE HTTP_WEB_SOCKET_MASK_KEY[] = {0x1, 0x2, 0x3, 0x4};
CStringA& HttpVersionToString(EnHttpVersion enVersion, CStringA& strResult)
{
strResult.Format("HTTP/%d.%d", LOBYTE(enVersion), HIBYTE(enVersion));
return strResult;
}
CStringA& MakeSecWebSocketAccept(LPCSTR lpszKey, CStringA& strAccept)
{
CStringA strKey(lpszKey);
strKey.Append(HTTP_WEB_SOCKET_SEC_SALT);
_SHA1_CTX ctx;
BYTE buf[SHA1_BLOCK_SIZE];
::sha1_init(&ctx);
::sha1_update(&ctx, (BYTE*)(LPCSTR)strKey, strKey.GetLength());
::sha1_final(&ctx, buf);
BYTE* lpszAccept = (BYTE*)strAccept.GetBuffer(SHA1_BLOCK_SIZE * 4 / 3 + 4);
int len = (int)::base64_encode(buf, lpszAccept, SHA1_BLOCK_SIZE, FALSE);
strAccept.ReleaseBufferSetLength(len);
return strAccept;
}
#endif