gh0st中读取配置文件的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hou09tian/article/details/81025836

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的指定keycontent进行读写操作。

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中读取了nameagesex的值。而经过最后三行代码之后,e:\yang.ini配置文件的内容变为

[yang1]

name=hou

age=27

sex=man

[yang2]

name=hehe

age=34

sex=man

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/81025836