在 CemuleApp::InitInstance() (第 672 行) 建立計時器,300ms 後觸發 CemuleDlg::StartupTimer,呼叫 OnBnClickedButton2() 開始連線。
兩者耦合度高,CServerConnect 驅動 CServerSocket 生命週期。
tryAnotherConnectionRequest() → ConnectToServer(next_server, true, !m_bTryObfuscated) 發起實際連線。在 CuploadQueue::UploadTimer() (第 965 行) 週期性檢查:
if (theApp.serverconnect->IsConnecting())
theApp.serverconnect->CheckForTimeout(); // 1 秒後檢查
void CServerSocket::OnConnect(int nErrorCode) {
if (正常) 發送登入訊息,關閉其他伺服器連線;
else 觸發 CServerConnect::ConnectionFailed() 重試下一台;
}
連線成功後發送登入封包,進入 connected 狀態,後續由 OnReceive 處理封包解析。
CServerConnect 內部狀態機抽離為獨立類別。CServerSocket 與 CServerConnect 相依性。本分析基於 eMule 0.47 版本。