介绍
原项目:
环境安装方式:
C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装
陈硕B站:
muduo 是一个在linux下的网络库。不跨平台。
该库还是比较知名的,但是由于历史遗留问题,要依赖boost库等问题。
有过一定的诟病,但是最为学习来说还是不错的,muduo库在实际项目中使用的人多吗? - 知乎 (zhihu.com)
Code
服务端code
/**
* muduo网络库给用户提供了两个主要的类
* TcpServer
* TcpClient
*
* epoll + 线程池
* 好处:能够把网络I/O的代码和业务逻辑代码分开
* 用户的连接与断开
* 用户的读写事件
*/
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpServer.h>
#include <functional>
#include <iostream>
#include <string>
using namespace muduo;
using namespace muduo::net;
/**
* 基于muduo网络库开发服务端程序
* 1. 组合TcpServer对象
* 2. 创建EventLoop事件循环对象的指针
* 3. 明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数
* 4.
* 在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
* 5. 设置合适的服务端线程数量,muduo会自动分配IO线程和worker线程
*/
class ChatServer {
public:
/**
* @brief Construct a new Chat Server object
*
* @param loop 事件循环
* @param listenAddr 监听端口
* @param nameArg 命名
*/
ChatServer(EventLoop* loop, const InetAddress& listenAddr,
const string& nameArg)
: _server(loop, listenAddr, nameArg), _loop(loop) {
// 给服务器注册用户连接的创建和断开回调
_server.setConnectionCallback(
std::bind(&ChatServer::onConnection, this, _1));
// 给服务器注册用户读写回调
_server.setMessageCallback(
std::bind(&ChatServer::onMessage, this, _1, _2, _3));
// 设置服务器的线程数量 1个IO线程 3个worker线程
_server.setThreadNum(4);
}
void start() {
std::cout << "Muduo Server Start" << std::endl;
_server.start();
}
private:
/**
* 专门处理用户的连接创建和断开
* epoll listenfd accept
*/
void onConnection(const TcpConnectionPtr& conn) {
// 连接成功
if (conn->connected()) {
std::cout << conn->peerAddress().toIpPort() << " -> "
<< conn->localAddress().toIpPort() << " state:online "
<< std::endl;
}
// 连接失败
else {
std::cout << conn->peerAddress().toIpPort() << " -> "
<< conn->localAddress().toIpPort() << " state:offline "
<< std::endl;
// close(fd)
conn->shutdown();
// _loop->quit();
}
}
/**
* @param coon 连接
* @param buf 缓冲区
* @param time 接受到数据的时间信息
*/
void onMessage(const TcpConnectionPtr& conn, Buffer* buffer,
Timestamp time) {
std::string buf = buffer->retrieveAllAsString();
std::cout << "recv data: " << buf << "time: " << time.toString()
<< std::endl;
// 回声服务器
conn->send(buf);
}
private:
TcpServer _server;
EventLoop* _loop; // epoll
};
int main() {
EventLoop loop;
InetAddress addr("127.0.0.1", 6000);
ChatServer server(&loop, addr, "CharServer");
// 启动服务
server.start();
// 以阻塞方式,等待事件
loop.loop();
return 0;
}
Makefile
SRC += server.cpp
TAR = server.out
${TAR} : ${SRC}
g++ \
$^ \
-o \
$@ \
-lmuduo_net \
-lmuduo_base \
-lpthread
简单讲解
muduo网络库给用户提供了两个主要的类
-
TcpServer
-
TcpClient
epoll + 线程池
好处:能够把网络I/O的代码和业务逻辑代码分开
-
用户的连接与断开
-
用户的读写事件
muduo使用起来还是简单和模板的。
因为封装的比较好,直接设置回调即可。
该代码主要内容TcpServer
和EventLoop
。
分别管理服务和事件循环,并相关依赖。
End
一份简单的客户端代码见本文:
当然可以直接用linux下的
telnet