程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Muduo網絡編程示例之零:前言

Muduo網絡編程示例之零:前言

編輯:關於C語言

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/simple/echo。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved