muduo库源码编译安装和环境搭建
C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客
#include<iostream>
#include<muduo/net/TcpServer.h>
#include<muduo/net/EventLoop.h>
using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;
/*
TcpServer:用于编写服务端程序
TcpClient:用于编写客户端程序
*/
class ChatServer
{
public:
ChatServer(
EventLoop* loop,//事件循环,epoll
const InetAddress& listenAddr,//网络地址
const string& nameArg//连接名称
):_server(loop,listenAddr,nameArg),_loop(loop)
{
//设置注册用户的连接建立和断开回调函数,
//即当程序连接建立或者断开时应该做什么事
_server.setConnectionCallback(std::bind(&ChatServer::onConnectionCallback,this,_1));
//设置注册用户的连接读写回调函数
_server.setMessageCallback(std::bind(&ChatServer::onMessageCallback,this,_1,_2,_3));
//设置服务端的线程数量,一个IO线程,3个工作线程
//muduo库会自行这是IO线程和工作线程的数量
_server.setThreadNum(4);
}
//开启事件循环
void start()
{
_server.start();
}
private:
TcpServer _server;
EventLoop *_loop;
//检测到连接建立或者断开时要做的事情 epoll、listenfd、accept
void onConnectionCallback(const TcpConnectionPtr& conn)//这是一个智能指针类型
{
if(conn->connected())//连接建立
{
cout<<conn->peerAddress().toIpPort()<<"->"
<<conn->localAddress().toIpPort()<<" state online"<<endl;
}else{
cout<<conn->peerAddress().toIpPort()<<"->"
<<conn->localAddress().toIpPort()<<" state offline"<<endl;
conn->shutdown();//close(fd)
}
}
//处理用户的数据读写事件
void onMessageCallback(const TcpConnectionPtr& conn,//连接
Buffer* buffer,//缓冲区
Timestamp time)//接收到数据的时间信息
{
string buf=buffer->retrieveAllAsString();//将接收到的缓冲数据转换为string类型
cout<<"recv data:"<<buf<<" time:"<<time.toString()<<endl;
conn->send(buf);
}
};
int main()
{
EventLoop loop;//epoll
InetAddress addr("127.0.0.1",6000);
ChatServer server(&loop,addr,"ChatServer");
server.start();
loop.loop();//epoll_wait,以阻塞方式等待新用户连接,已连接用户的读写事件等
return 0;
}
打开一个linux终端写下编译命令
g++ -o server muduo_server.cpp -lmuduo_net -lmuduobase -lpthread
运行server端之后,再打开一个终端,运行telnet命令作为客户端进行测试