· 설명 : 간단한 에코 서버입니다.
• 라이브러리 설치의 필요성 : muduo는 부스트
· 라이브러리를 설치 한 후, 직접 프로그램을 실행 다음 명령 (+ 컴파일러 실행)를 실행 :
g++ -o test test.cpp -lmuduo_net -lmuduo_base -lpthread; ./test
다음과 같이 Test.cpp에 코드입니다 :
#include <muduo/net/TcpServer.h>
#include <muduo/base/Logging.h>
#include <muduo/net/EventLoop.h>
#include <boost/bind.hpp>
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(muduo::net::EventLoop *loop, const muduo::net::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 muduo::net::TcpConnectionPtr &conn){ // TCP连接与断开时都会调用它
LOG_INFO << "EchoServer - client(" << conn->peerAddress().toIpPort() << ") -> server(" << conn->localAddress().toIpPort() << ") is " << (conn->connected() ? "UP":"DOWN");
}
void EchoServer::onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp time){
muduo::string msg(buf->retrieveAllAsString()); // 取走数据
LOG_INFO << conn->name() << "echo " << msg.size() << "bytes, " << "data received at " << time.toString();
conn->send(msg);
}
int main()
{
LOG_INFO << "pid = " << getpid();
muduo::net::EventLoop loop;
muduo::net::InetAddress listenAddr(2007);
EchoServer server(&loop, listenAddr);
server.start();
loop.loop();
return 0;
}
결과는 다음과 같습니다 :
텔넷 서버 테스트 프로그램 (텔넷 서버 주소 포트 번호) :
telnet 192.168.31.225 2007
다음과 같이 테스트 결과는 다음과 같습니다
참조 "리눅스 멀티 스레드 서버 측 프로그래밍."