在 BOOL CemuleApp::InitInstance() 函数 的 672行(VERIFY( (m_hTimer = ::SetTimer(NULL, NULL, 300, StartupTimer)) != NULL );
) 启动一个按时器 在该按时器的 执行函数( void CALLBACK CemuleDlg::StartupTimer(HWND /*hwnd*/, UINT /*uiMsg*/, UINT /*idEvent*/, DWORD /*dwTime*/))
的 814 行 theApp.emuledlg->OnBnClickedButton2();毗连到emule处事器
CServerSocket 就是一个客户端与处事器会话的类(可能说是处事器类),它毗连某 一详细处事器 ,处理惩罚所有与此处事器有关的事物,好比(详细的)发数据,收数据,连 接到来等
在毗连到来的函数(void CServerSocket::OnConnect(int nErrorCode))里处理惩罚各类 环境(是否继承实验毗连)
virtual void OnReceive(int nErrorCode) 函数里处理惩罚收到的数据包.
由于毗连较量巨大,所以专门封装了一个类 CServerConnect 来毗连处事器。 CServerConnect驱动与多个处事器的毗连,遏制毗连实验,断开毗连 ,对毗连后的详细 信息的处理惩罚(如 毗连正确 则发送 登岸动静,错误 则从头毗连) 超时检测等
此两个类 耦合性 较强,所以阐明起来较量贫苦。较量好的环境是 只有导出耦合干系 ,一个类之引用另一个类
另对两个类相关的有些函数可以疏散出来形成一个新的类,这样职责较量单一
异常: 对付 CServerConnect类 内部维持一个状态机(connecting 和connected 两 种状态)
针对两种环境有差异处理惩罚,如为connecting 状态 则客户类 多次启动一个新毗连
对付 CServerSocket类,毗连到来后 也有差异的环境 假如 正常 则发登岸动静,关 闭所有的与其它处事器的毗连
假如失败 则 要 CServerConnect 启动一个按时器 开始一个新的毗连
实验毗连处事器
第一步:
ConnectToAnyServer(UINT startAt, bool prioSort, bool isAuto, bool bNoCrypt) ;
在该函数里 首先 遏制 所有已经毗连 和正在毗连中的
假如有静态处事器 则处理惩罚
监听套接字启动监听
tryAnotherConnectionRequest();
// 启动毗连
正常环境下 在tryAnotherConnectionRequest函数里启动
ConnectToServer(next_server, true, !m_bTryObfuscated);
该函数真正实现一个与处事器毗连,假如正在毗连 则在
CuploadQueue ::UploadTimer()函数的 965行
if (theApp.serverconnect->IsConnecting())//假如正在毗连则查抄是否超时
theApp.serverconnect->CheckForTimeout(); //一秒钟今后查抄毗连是否超时
查抄是否毗连超时
假如 已经毗连进去可能 处事器期待登岸信息 则发送登岸信息
当正在毗连时,客户端会期待 毗连事件产生
void CServerSocket::OnConnect(int nErrorCode)
在该函数里处理惩罚各类毗连事件,假如正常的话 则发登岸动静 不正常的话 则从头启动 与其它处事器毗连
异常环境 处理惩罚函数
void CServerConnect::ConnectionFailed(CServerSocket* sender)
驴子毗连处事器的进程写的较量细腻,主要有两个类CServerSocket, CServerConnect 来完成处事器的毗连与通讯
在 BOOL CemuleApp::InitInstance() 函数 的 672行(VERIFY( (m_hTimer = ::SetTimer(NULL, NULL, 300, StartupTimer)) != NULL );
) 启动一个按时器 在该按时器的 执行函数( void CALLBACK CemuleDlg::StartupTimer(HWND /*hwnd*/, UINT /*uiMsg*/, UINT /*idEvent*/, DWORD /*dwTime*/))
的 814 行 theApp.emuledlg->OnBnClickedButton2();毗连到emule处事器
登岸处事器
以上根基完成了处事器毗连的进程