本系列將涵蓋:UNP 簡單協議、Boost.Asio/Netty/Twisted 示例移植、Roundtrip/Pingpong 壓測、Multiplexer、文件傳輸、Pub/Sub Hub、SOCKS4a 代理、短網址 HTTP 服務、Sudoku 多線程演進等。示例代碼已收錄於 muduo/examples(下載:muduo-0.1.5-alpha.tar.gz)。
accept、Client connect 成功。close/shutdown、被動 read 返回 0。EPOLLOUT?如何避免 busy-loop 或漏讀?readv + 棧上空間巧妙解決。所有答案均在 Muduo 源碼中。
減少「偶發複雜性」(Accidental Complexity),讓程序員專注業務邏輯。特點:
// echo.h
class EchoServer {
public:
EchoServer(EventLoop* loop, const InetAddress& listenAddr);
void start();
private:
void onConnection(const TcpConnectionPtr& conn);
void onMessage(const TcpConnectionPtr& conn, Buffer* buf, Timestamp time);
EventLoop* loop_;
TcpServer server_;
};
// echo.cc
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 << 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);
}
// main.cc
int main() {
LOG_INFO << "pid = " << getpid();
EventLoop loop;
InetAddress listenAddr(2007);
EchoServer server(&loop, listenAddr);
server.start();
loop.loop();
}
完整代碼見 muduo/examples/simple/echo。下一篇將詳細分析五個簡單 TCP 協議實現。