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

Muduo網絡編程示例之四:Twisted Finger 協議漸進式實作

     編輯:關於C語言

從零開始的 Finger 服務

Finger 協議(RFC 1288)是早期用戶資訊查詢服務。本示例以七個漸進步驟,展示如何用 Muduo 從空殼程式構建完整的 Finger 伺服器,每一步僅增加極少量代碼,極適合理解事件驅動模型。

七個演進階段

  1. 拒絕連線:僅啟動 EventLoop,不監聽任何埠。
  2. 接受連線:建立 TcpServer 監聽 1079 埠,連線後不處理資料(Muduo 自動丟棄)。
  3. 主動斷開:在 onConnection 中檢測連線建立,立即呼叫 shutdown()。
  4. 讀取用戶名再斷開:在 onMessage 中用 buf->findCRLF() 尋找換行,找到即斷開。(存在安全隱患:惡意客戶端不發換行會撐爆記憶體;線性查找在逐字節發送下退化為 O(N²))
  5. 回應錯誤訊息:找到換行後發送 No such user 再斷開。
  6. 查詢空 UserMap:解析用戶名,在 std::map 中查找(始終失敗),回應結果並斷開。
  7. 預置用戶資料:在 main() 中向 UserMap 插入一筆資料 users["schen"] = "Happy and well",查詢成功時回應真實資訊。

核心代碼片段(第 7 版)

typedef std::map<string, string> UserMap;
UserMap users;

string getUser(const string& user)
{
    string result = "No such user";
    auto it = users.find(user);
    if (it != users.end()) result = it->second;
    return result;
}

void onMessage(const TcpConnectionPtr& conn, Buffer* buf, Timestamp)
{
    const char* crlf = buf->findCRLF();
    if (crlf)
    {
        string user(buf->peek(), crlf);
        conn->send(getUser(user) + "\n");
        buf->retrieveUntil(crlf + 2);
        conn->shutdown();
    }
}

Telnet 測試實況

$ telnet localhost 1079
Trying 127.0.0.1...
Connected to localhost.
muduo
No such user
Connection closed by foreign host.

$ telnet localhost 1079
schen
Happy and well
Connection closed by foreign host.

教學價值

此系列示範了 Muduo 以回呼為中心的編程風格:onConnection 處理連線生命週期,onMessage 處理資料流,業務邏輯逐層疊加。同時也暴露了基於分隔符分包的潛在效能與安全風險,為後續引入長度前綴編解碼器鋪墊。

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