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

Muduo 網絡庫入門(零):Echo 服務器三步走,回調驅動極簡體驗

     編輯:關於C語言

Muduo 設計初衷

簡化 Linux 2.6+ 下並發非阻塞 TCP 編程,讓開發者聚焦業務邏輯,而非與 Socket API 纏鬥——減少「偶發複雜性」(Brooks 語)。

核心特性

  • 無需繼承基類、覆寫虛函數
  • 只需註冊三個半事件回調:連接建立/斷開、消息到達、寫完成、高水位標記

經典 Echo 服務器實現

1. 定義 Server 類(無繼承)

class EchoServer {
public:
    EchoServer(muduo::net::EventLoop* loop, const muduo::net::InetAddress& listenAddr);
    void start();
private:
    void onConnection(const muduo::net::TcpConnectionPtr& conn);
    void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp time);
    muduo::net::EventLoop* loop_;
    muduo::net::TcpServer server_;
};

2. 構造函數註冊回調


EchoServer::EchoServer(EventLoop* loop, const InetAddress& listenAddr)
    : loop_(loop), server_(loop, listenAddr, "EchoServer") {
    server_.setConnectionCallback(boost::bind(&EchoServer::onConnection, this, _1));
    server_.setMessageCallback(boost::bind(&EchoServer::onMessage, this, _1, _2, _3));
}
void EchoServer::start() { server_.start(); }

3. 實現回調邏輯


void EchoServer::onConnection(const TcpConnectionPtr& conn) {
    LOG_INFO << "EchoServer - " << conn->peerAddress().toHostPort()
              << " -> " << conn->localAddress().toHostPort()
              << " is " << (conn->connected() ? "UP" : "DOWN");
}
void EchoServer::onMessage(const TcpConnectionPtr& conn, Buffer* buf, Timestamp time) {
    string msg(buf->retrieveAsString());
    LOG_INFO << conn->name() << " echo " << msg.size() << " bytes at " << time.toString();
    conn->send(msg); // 原樣回射
}

4. main() 啟動事件循環


int main() {
    LOG_INFO << "pid = " << getpid();
    EventLoop loop;
    InetAddress listenAddr(2007);
    EchoServer server(&loop, listenAddr);
    server.start();
    loop.loop(); // 進入事件循環
}

完整代碼見

muduo/examples/simple/echo

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