gh0st监听的端口和服务端最大连接的数量是通过配置文件进行读取的。
1 相关代码
在gh0st.cpp文件中,CGh0stApp::InitInstance()函数中,有如下代码代码
int nPort = m_IniFile.GetInt("Settings", "ListenPort");
int nMaxConnection = m_IniFile.GetInt("Settings", "MaxConnection");
if (nPort == 0)
nPort = 80;
if (nMaxConnection == 0)
nMaxConnection = 10000;
可以看到,使用m_IniFile变量获取gh0st监听的端口和最大连接数量,如果这两个变量值是0,则为其赋初值。
2 CIniFile类
从“1 相关代码”提到的代码中,m_InitFile变量是自定义类CIniFile类的对象。通过该类的GetInt()函数获取在配置文件中的端口号和最大连接数。GetInt()函数的代码如下所示:
int CIniFile::GetInt(CString AppName,CString KeyName,int Default)
{
return ::GetPrivateProfileInt(AppName, KeyName, Default, IniFileName);
}
2.1相关函数
在“2 CIniFile类”中提到,该类的GetInt()函数使用API函数GetPrivateProfileInt()函数获取了配置文件中的信息。该系列的函数含包括GetPrivateProfileString()和WritePrivateProfileString()函数。
以上三个函数都是对配置文件中指定节的指定键进行读写操作。
相关链接
配置文件一般是ini格式的文件。这种配置文件的内容格式一般为
[section]
key1=content1
key2=content2
key3=content3
其中,section是为节;key是键。而上述三个参数就是对配置文件中指定section的指定key的content进行读写操作。
2.1.1 GetPrivateProfileInt()函数
GetPrivateProfileInt()函数的作用是从指定节的指定键中读取整数。该函数的格式为:
UINT GetPrivateProfileInt( LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName );
其中,第一个参数lpAppName是指定节的名称;第二个参数lpKeyName是指定键的名称;如果在指定节上找不到指定的键,则使用nDefault值作为获取到的的值;第四个参数lpFileName指定了配置文件的路径。该函数的返回值即为获取到的键的内容。
2.1.2 GetPrivateProfileString()函数
GetPrivateProfileString()函数的作用是从指定节的指定键中读取字符串。该函数的格式为
DWORD GetPrivateProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName );
其中,前三个参数与GetPrivateProfileInt()函数相同;第四个参数lpReturnedString用于存储获取到的字符串;第五个参数nSize指定了lpReturnedString的大小;第六个参数lpFileName指定了配置文件的路径。
2.1.3 WritePrivateProfileString()函数
该函数的作用是将字符串写入到指定节的指定键中。该函数的格式为
BOOL WritePrivateProfileString( LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName );
该函数四个参数分别表示节的名称、键的名称、写入的内容和配置文件的绝对路径。如果写入成功,则返回值是TRUE,否则是FALSE。
2.2 CIniFile类分析
2.2.1 构造函数
在CIniFile类的构造函数中,获取了gh0st程序的名称,并且根据程序名称指定了程序的配置文件名称。
char szAppName[MAX_PATH];
int len;
::GetModuleFileName(AfxGetInstanceHandle(), szAppName, sizeof(szAppName));
len = strlen(szAppName);
for(int i=len; i>0; i--)
{
if(szAppName[i] == '.')
{
szAppName[i+1] = '\0';
break;
}
}
strcat(szAppName, "ini");
IniFileName = szAppName;
以上代码通过GetModuleFileName()函数获取gh0st程序的名称,该名称的格式为gh0st.exe。之后在for循环中找到获取到名称中的“.”的位置,并且进行截取,只取“.”之前的名字,即gh0st。最后,将配置文件名设置为gh0st.ini。
2.2.2 操作配置文件的函数
操作配置文件的函数主要分为读取配置文件和写入配置文件两类。其中,读取配置文件的函数包括GetString()/GetInt()/GetDWORD(),写入配置文件的函数包括SetString()/SetInt()/SetDouble()/SetDWORD()。这些函数使用“2.1相关函数
”中提到的API函数对“2.2.1 构造函数”中获取的配置文件名进行操作。
3 实例代码
在VS2015中新建一个控制台程序。输入以下代码
wchar_t name[20] = { 0 };
unsigned int age = 0;
wchar_t sex[10] = { 0 };
::GetPrivateProfileString(_T("yang1"), _T("name"), _T("Unname"), name, 20, _T("e:\\yang.ini"));
age = ::GetPrivateProfileInt(_T("yang1"), _T("age"), 18, _T("e:\\yang.ini"));
::GetPrivateProfileString(_T("yang1"), _T("sex"), _T("man"), sex, 10, _T("e:\\yang.ini"));
::WritePrivateProfileString(_T("yang2"), _T("name"), _T("hehe"), _T("e:\\yang.ini"));
::WritePrivateProfileString(_T("yang2"), _T("age"),_T("34"), _T("e:\\yang.ini"));
::WritePrivateProfileString(_T("yang2"), _T("sex"), _T("man"), _T("e:\\yang.ini"));
其中,配置文件的位置是e:\yang.ini,其内容为
[yang1]
name=hou
age=27
sex=man
经过以上代码,从配置文件yang.ini中读取了name、age和sex的值。而经过最后三行代码之后,e:\yang.ini配置文件的内容变为
[yang1]
name=hou
age=27
sex=man
[yang2]
name=hehe
age=34
sex=man