首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

eMule 源碼深度分析 (二):伺服器連線與會話管理

     編輯:關於C++

啟動連線流程

在 CemuleApp::InitInstance() (第 672 行) 建立計時器,300ms 後觸發 CemuleDlg::StartupTimer,呼叫 OnBnClickedButton2() 開始連線。

核心類別架構

  • CServerSocket:單一伺服器會話物件,處理該伺服器的收發資料、連線事件。
  • CServerConnect:管理多伺服器連線嘗試、狀態機 (connecting/connected)、超時偵測、登入訊息發送、失敗重試。

兩者耦合度高,CServerConnect 驅動 CServerSocket 生命週期。

連線狀態機細節

CServerConnect::ConnectToAnyServer()

  1. 停止所有現有連線與嘗試。
  2. 處理靜態伺服器清單。
  3. 啟動監聽 Socket。
  4. 呼叫 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 版本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved