使用muduo库编写回射服务器echo

muduo是独一本事情驾驶的非闭塞广泛分布库,写C 和Boost库。

(一)应用muduo调解echo回射服务性的

在GitHub下载muduo源码,应用内未经触动的的缀编,看装扮,您可以设置调试版本或版本吗?,并命名优美的体型方向。:默许是代班人,优美的体型的库和头证件在${HOME}/build/release-install编目录下,由于muduo是恒稳态交链的C++图书馆,到这地步,当您应用它时,必要命名头证件编目录。,和库证件编目录,并交链中肯的的恒稳态库证件-lmuduo_net -lmuduo_base)。

we的所有格形式熟习回送服务性的效能。,普通步调列举如下:

1。创办套接字 socket
2。绑定左转舵 bind
三.监控插座 listen
4。闭塞可得到客户端衔接 accept
5。衔接设置无怨接受来回,闭塞可得到客户端音讯 recv
6。向客户端发送音讯音讯 write

本事情的非闭塞广泛分布训练,是调解高机能被附加广泛分布服务性的的主流浇铸。,这样的,你率先适宜使转动下面的步调。:把从前的主动精神语态调动recv接纳知识,主动精神调动无怨接受衔接,主动精神调动发送知识,换上衣服自动记录器知识搜集的回信汇数,广泛分布库接纳知识给我听筒。,目前的给我知识,让我去消耗;自动记录器接纳衔接的回调,广泛分布库无怨接受独一新的衔接,并会回调我。,供我应用;当您必要发送知识时,只写衔接,广泛分布库符合收回不闭塞的通知。。”

怎样应用epoll轮询,怎样应用穿成串池分派职责和别的特殊性,殷勤的看懂源代码后殷勤的念书。。率先学会应用muduo库调解独一回射服务性的echo顺序。

目前的调解回信汇数

#include #include #include #include #include usingnamespace muduo;
usingnamespace muduo::net;

void onConnection(const TcpConnectionPtr Conn)
{
    LOG_INFO << "EchoServer - " << conn->peerAddress().toIpPort() << " -> "
    << conn->localAddress().toIpPort() << " is "
    << (conn->connected() ? "UP" : "DOWN");
}

void 音讯const TcpConnectionPtr &conn,
    Buffer *buf,
    Timestamp 工夫)
{
    muduo::string msg(buf->retrieveAllAsString());
    LOG_INFO << conn->name() << " echo " << () << " bytes, "
    << "data received at " << ();
    conn->发送(MSG)
}

int main(int argc, constchar *argv[])
{
    EventLoop loop;
    它 addr("", 1024);
    TcpServer 服务性的(圆状物), addr, "echo");
    (&onConnection);
    音讯)
    ();
    ();
    return0;
}

面容瞄准的思惟

可供选择的事物方式是将回信汇数的自动记录器以书面提出C中。,书中规定的举例列举如下:

#ifndef __ECHOSERVER_H__#define __ECHOSERVER_H__#include class EchoServer
{
    public:
        EchoServer(muduo::net::EventLoop* loop,
            const muduo::net::它& listenAddr);void start();  private:
        void onConnection(const muduo::net::TcpConnectionPtr& Conn)

        void 音讯const muduo::net::TcpConnectionPtr& conn,
            muduo::net::Buffer* buf,
            muduo::Timestamp 工夫);

        muduo::net::TcpServer server_;
};

#endif
#include ""#include #include 

EchoServer::EchoServer(muduo::net::EventLoop* loop, 
                    const muduo::net::它& listenAddr)
                    : server_(loop, listenAddr, "EchoServer")
    {
        (
            boost::bind(&EchoServer::onConnection, this, _1));
        (
            帮助::绑定(与echoserver::音讯, this, _1, _2, _3));
    }

void EchoServer::start()
{
    ();
}

void EchoServer::onConnection(const muduo::net::TcpConnectionPtr& Conn)
{
    LOG_INFO << "EchoServer - " << conn->peerAddress().toIpPort() << " -> "
    << conn->localAddress().toIpPort() << " is "
    << (conn->connected() ? "UP" : "DOWN");
}

void EchoServer::音讯const muduo::net::TcpConnectionPtr& conn,
    muduo::net::Buffer* buf,
    muduo::Timestamp 工夫)
{
    muduo::string msg(buf->retrieveAllAsString());
    LOG_INFO << conn->name() << " echo " << () << " bytes, "
    << "data received at " << ();

    conn->发送(MSG)
}
#include ""#include #include int main()
{
  LOG_INFO << "pid = " << getpid();
  muduo::net::EventLoop loop;
  muduo::net::它 listenAddr(1024);
  EchoServer 服务性的(圆状物), listenAddr);
  ();
  ();
  return0;
}

写makefile

muduo是恒稳态交链的C++图书馆,你必要命名的头证件和库证件方向的makefil。

PROGS+=echo1 echo2
CLEANFILES = core 小瘤。 *.core *.o temp.* *.out typescript* \
        *.lc *.lh *.bsdi *.sparc *.uw

MUDUO_DIRECTORY = ${HOME}/build/release-install
MUDUO_INCLUDE = $(MUDUO_DIRECTORY)/include
MUDUO_LIBRARY = $(MUDUO_DIRECTORY)/lib
OUTPUT=${PWD}/bin

all :${PROGS}



MAKE_BIN_DIR := (壳 mkdir -p (出口) )

CXXFLAGS+=-g -std=c++11 -I${MUDUO_INCLUDE}
LDFLAGS+=-L${MUDUO_LIBRARY} -lmuduo_net -lmuduo_base -lpthread -lrt

echo1:echo1/
    ${CXX}${CXXFLAGS}  -o ${OUTPUT}/$@   $^  ${LDFLAGS}
    @rm echo1/*.o
echo2: echo2/echo2.o echo2/echoserver.o
    ${CXX}${CXXFLAGS} -o ${OUTPUT}/$@   $^  ${LDFLAGS}
    @rm echo2/*.o

clean:
    rm -rf ${OUTPUT} 


.PHONY: all clean

1.4 受测验配乐服务性的回响

褊狭的运转,应用netcat举行受测验:

nc localhost 1024

服务性的将来回译文典型。:

这里写图片描述

依据we的所有格形式的回信汇数,服务性的也有中肯的的通知。:

这里写图片描述


(二)求教于

1。linux多穿成串服务性的训练 应用muduo C 广泛分布库

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注