当前位置:编程学习 > C/C++ >>

Muduo网络编程示例之零:前言

Muduo 简介
我编写 Muduo 网络库的目的之一就是简化日常的 TCP 网络编程,让程序员能把精力集中在业务逻辑的实现上,而不要天天和 Sockets API 较劲。借用 Brooks 的话说,我希望 Muduo 能减少网络编程中的偶发复杂性 (accidental complexity)。

Muduo 只支持 Linux 2.6.x 下的并发非阻塞 TCP 网络编程

Muduo 的使用非常简单,不需要从指定的类派生,也不用覆写虚函数,只需要注册几个回调函数去处理前面提到的三个半事件就行了。

以经典的 echo 回显服务为例:

1. 定义 EchoServer class,不需要派生自任何基类:

view plaincopy to clipboardprint?
#ifndef MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H   
#define MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H  
#include  
// RFC 862   
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_;   
};  
#endif  // MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H  
#ifndef MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H
#define MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H
#include
// RFC 862
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_;
};
#endif  // MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H 

在构造函数里注册回调函数:

view plaincopy to clipboardprint?
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();   
}  
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();

2. 实现 EchoServer::onConnection() 和 EchoServer::onMessage():

view plaincopy to clipboardprint?
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);   
}  
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);

3. 在 main() 里用 EventLoop 让整个程序跑起来:

view plaincopy to clipboardprint?
#include "echo.h"  
using namespace muduo;   
using namespace muduo::net;  
int main()   
{   
  LOG_INFO << "pid = " << getpid();   
  EventLoop loop;   
  InetAddress listenAddr(2007);   
  EchoServer server(&loop, listenAddr);   
  server.start();   
  loop.loop();   
}  
#include "echo.h"
using namespace muduo;
using namespace muduo::net;
int main()
{
  LOG_INFO << "pid = " << getpid();
  EventLoop loop;
  InetAddress listenAddr(2007);
  EchoServer server(&loop, listenAddr);
  server.start();
  loop.loop();

完整的代码见 muduo/examples/易做图/echo。

 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,