Finger 協議(RFC 1288)是早期用戶資訊查詢服務。本示例以七個漸進步驟,展示如何用 Muduo 從空殼程式構建完整的 Finger 伺服器,每一步僅增加極少量代碼,極適合理解事件驅動模型。
EventLoop,不監聽任何埠。TcpServer 監聽 1079 埠,連線後不處理資料(Muduo 自動丟棄)。onConnection 中檢測連線建立,立即呼叫 shutdown()。onMessage 中用 buf->findCRLF() 尋找換行,找到即斷開。(存在安全隱患:惡意客戶端不發換行會撐爆記憶體;線性查找在逐字節發送下退化為 O(N²))No such user 再斷開。std::map 中查找(始終失敗),回應結果並斷開。main() 中向 UserMap 插入一筆資料 users["schen"] = "Happy and well",查詢成功時回應真實資訊。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 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 處理資料流,業務邏輯逐層疊加。同時也暴露了基於分隔符分包的潛在效能與安全風險,為後續引入長度前綴編解碼器鋪墊。