我带大家来研究一下eMule是如何运转的,
先说一个额外的话题,我强烈鄙视,'我思念的城市'这位网友,他在eNet程序员论坛 » 挨踢生涯 中发表的文章:c++程序员修炼真经之四,是全文抄袭我的原创,极度鄙视这种用别人的智慧装点
自己门面的人.
首先大家找到emule.cpp
CemuleApp::CemuleApp(LPCTSTR lpszAppName) :CWinApp(lpszAppName)
里面大量的版本信息啊,界面大小图标啊,加载gdiplus.dll,我们先不看,就看这句 m_UPnP_IGDControlPoint = CUPnP_IGDControlPoint::GetInstance();
这是在启动电驴的PnP控制
然后我们看BOOL CemuleApp::InitInstance() 这里面最主要的就是他的配置类的初始化,
这个配置类在eMule整个程序运行的过程中都会起到非常重要的作用,
thePrefs.Init();
更重要的马上就登场了 CemuleDlg dlg;
emuledlg = &dlg;
m_pMainWnd = &dlg;
我们立即转到 BOOL CemuleDlg::OnInitDialog() 去看看
这里面绝大部分都是eMule界面的一些参数预设置,但是最核心的一个步骤,老外也很不厚道啊,他隐藏的很神秘啊,现在我来为大家点出来
VERIFY( (m_hTimer = ::SetTimer(NULL, NULL, 300, StartupTimer)) != NULL );
在这里他启动了一个非常重要的定时器,
void CALLBACK CemuleDlg::StartupTimer(HWND /*hwnd*/, UINT /*uiMsg*/, UINT /*idEvent*/, DWORD /*dwTime*/)
我们来看他的
case 4
try {
theApp.downloadqueue->Init();
}
非常关键的一步,他在初始化他的下载队列,
theApp.listensocket->StartListening() 启动监听端口,
可以接受连接了
theApp.clientudp->Create() 创建UDP客户端
再看case 6
AfxBeginThread(RUNTIME_CLASS(CAICHSyncThread),THREAD_PRIORITY_BELOW_NORMAL,0);
这是他的智能HASH算法线程,以后会和大家讲到.从这时起整个电驴就跑起来啦