簡化 Linux 2.6+ 下並發非阻塞 TCP 編程,讓開發者聚焦業務邏輯,而非與 Socket API 纏鬥——減少「偶發複雜性」(Brooks 語)。
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_;
};
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(); }
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); // 原樣回射
}
int main() {
LOG_INFO << "pid = " << getpid();
EventLoop loop;
InetAddress listenAddr(2007);
EchoServer server(&loop, listenAddr);
server.start();
loop.loop(); // 進入事件循環
}
muduo/examples/simple/echo