好友
阅读权限10
听众
最后登录1970-1-1
|
gh0st客户端分析
现在开始分析gh0st客户端程序框架。
首先我们知道,gh0st是单文档类型的程序框架。
文档类型的都是从theApp开始的。theApp是一个全局变量。
那我们就先看一下CGh0stApp这个类的初始化函数
BOOL CGh0stApp::InitInstance()
下面很大一部分是生成的框架。我给大家指出来,就没必要再看这些了
直到 if (!ProcessShellCommand(cmdInfo))
return FALSE;
都是框架。不去看。分析下面的。
m_pMainWnd->SetMenu(NULL);去掉菜单栏,把这句注释掉就有菜单栏了。
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
这两句是显示主界面的。
下面自带的注释大家都知道了,就是启动IOCP服务器,就是建立套接字并监听
只不过用的模型是IOCP完成端口的。
首先是获取配置文件信息。
m_IniFile.GetInt("Settings", "ListenPort");
获取端口号,最大连接数。
((CMainFrame*) m_pMainWnd)->Activate(nPort, nMaxConnection);
我们来看这句。
这句是调用CMainFrame类的Activate函数。
m_pMainWnd是单文档类的主界面指针,也是框架类指针。就是CMainFrame类
接下来我们就去Activate函数里面看看
我就在程序里面注释给大家看吧。
BOOL CGh0stApp::InitInstance() //第一步
{
获取端口号();
激活IOCP();/////// m_pMainWnd)->Activate
}
((CMainFrame*) m_pMainWnd)->Activate(nPort, nMaxConnection)//第二步
{
初始化变量;
完成对象->初始化(传递回调函数,,,);////// m_iocpServer->Initialize();
设置状态栏状态();
}
bool CIOCPServer::Initialize(NOTIFYPROC pNotifyProc, CMainFrame* pFrame, int nMaxConnections, int nPort)// 第三步
{
保存指针;
创建监听套接字();
设置FD_ACCEPT();
绑定端口();
监听端口();
创建监听线程();//////////////////// ListenThreadProc//第四步
如果(线程创建==成功)
{
初始化完成端口();///// InitializeIOCP();第六步
}
}
bool CIOCPServer::InitializeIOCP(void)//第六步
{
创建完成端口();
根据系统信息创建工作者线程();////// ThreadPoolFunc//第七步
}
unsigned CIOCPServer::ListenThreadProc(LPVOID lParam)//第四步
{
获取FD_ACCEPT事件();
调用接收函数();///// pThis->OnAccept()第五步
}
void CIOCPServer::OnAccept()//第五步
{
获取客户端套接字();
创建客户端上下文变量();//保存客户端套接字
关联完成端口();
设置套接字状态();
将客户端上下文添加至上下文列表();
投递一个IO初始化到完成端口();
调用回调函数,通知主对话框有客户连接();
投递WSARecv()到完成端口,等待接收客户端数据();
}
unsigned CIOCPServer::ThreadPoolFunc (LPVOID thisContext) //第七步
{
获取IO完成状态();
出错处理();
如果(结果==正确)
{
根据IO完成状态进行相应处理();//我们还要看一下相应处理函数。
}
}
BEGIN_IO_MSG_MAP()//这个就是他的相应处理消息表。去分析以下这些处理函数
IO_MESSAGE_HANDLER(IORead, OnClientReading)
IO_MESSAGE_HANDLER(IOWrite, OnClientWriting)
IO_MESSAGE_HANDLER(IOInitialize, OnClientInitializing)
END_IO_MSG_MAP()
//再把这些函数的框架写一下
bool CIOCPServer::OnClientReading(ClientContext* pContext, DWORD dwIoSize)
{
判断(是否断开)
{
移除客户端();
}
判断(包格式是否不同)
{
重发();
}
写入接收数据到缓冲区();
通知主框架处理NC_RECEIVE();
判断(包数据是否正确)
{
不正确处理();
正确->通知主框架处理NC_RECEIVE_COMPLETE();
}
投递接收();
}
其他的几个就不给大家分析了。或者放在下次分析。
这只是一个简单的框架分析。对理清程序处理结构有帮助,但对修改个人专版,没有多大帮助。
简单说一下界面美化。现在的美化,基本上都是添加一个工具栏。工具栏可以上网查CToolBar这个类
当然懂得MFC的自然知道了。
主要就是在CMainFrame类的OnCreate里面添加,创建一个工具栏
可以参考gh0st里面自带的程序段。给大家搜索一下吧。
要想添加工具条,现在资源的Toolbar中new一个工具栏
这些代码就是添加工具栏的。至于其他的美化,还是研究一下MFC吧。好了,先到这里吧
视频下载:http://www.rayfile.com/zh-cn/fil ... -b93a-0014221b798a/ |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|