eMule电驴eDonkey从死到生

来源:互联网 发布:iot js 机 编辑:程序博客网 时间:2024/05/01 22:33

我带大家来研究一下eMule是如何运转的,

先说一个额外的话题,我强烈鄙视,'我思念的城市'这位网友,他在eNet程序员论坛menuregister(false, "forumlist") » 挨踢生涯  中发表的文章: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算法线程,以后会和大家讲到.从这时起整个电驴就跑起来啦  

原创粉丝点击