当前位置: 首页 > news >正文

【Linux】—— muduo网络库的安装配置与使用

muduo网络库编程

Linux环境下Epoll+pthread线程库

Boost库安装与使用

  1. 安装Boost库
    下载boost库源码,linux环境解压
    tar -zxvf boost_1_69_0.tar.gz

  2. 解压完成后,进入该目录,查看内容
    在这里插入图片描述

  3. 运行bootstrap.sh工程编译构建程序
    ./bootstrap.sh
    在这里插入图片描述

  4. 源码根目录下生成了b2程序,运行b2程序如下(boost源码比较大,这里编译需要花费一些时间):

【注意】:如果Linux系统没有安装g++编译器,需要先安装g++,建议g++4.6版本以上,能比较好的支持C++新标准,可以通过命令 g++ --version 查看g++版本号。

./b2

编译完成后
最后,再把上面的boost库头文件和lib库文件安装在默认的Linux系统头文件和库文件的搜索路径下,运行下面命令(因为要给/usr目录下拷贝文件,需要先进入root用户):
root@tony-virtual-machine:/home/tony/package/boost_1_69_0# ./b2 install
在这里插入图片描述
5. 测试编译

#include <iostream>
#include <boost/bind.hpp>
#include <string>
using namespace std;
class Hello
{
public:void say(string name) { cout << name << " say: hello world!" << endl; }
};int main()
{Hello h;auto func = boost::bind(&Hello::say, &h, "zhang san");func();return 0;
}

muduo的使用

muduo-master.zip
cd muduo-master
ls

在这里插入图片描述

vim编辑上面源码目录里面的CMakeLists.txt文件,如下修改:
在这里插入图片描述
执行./build.sh
在这里插入图片描述

编译完成后,输入./build.sh install 进行安装muduo库
这个./build.sh install实际上把muduo的头文件和lib库文件放到了muduo-master同级目录下的build目录下的release-install-cpp11文件夹下面了, install 会把muduo的头文件和lib库文件放到muduo-master同级目录下的build文件夹下~

echo ‘main(){}’|gcc -E -v - 查看include搜索路径,可以看到include搜索路径

install安装会导致我们每次编译程序都需要指定muduo库的头文件和库文件路径,很麻烦,所以我们选择直接把inlcude(头文件)和lib(库文件)目录下的文件拷贝到系统目录下:

root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11# ls
include  lib
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11# cd include/
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11/include# ls
muduo
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11/include# mv muduo/ /usr/include/
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11/include# cd ..
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11# ls
include  lib
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11# cd lib/
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11/lib# ls
libmuduo_base.a  libmuduo_http.a  libmuduo_inspect.a  libmuduo_net.a
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11/lib# mv * /usr/local/lib/
root@tony-virtual-machine:/home/tony/package/build/release-install-cpp11/lib# 

拷贝完成以后使用muduo库编写C++网络程序,不用在指定头文件和lib库文件路径信息了,因为g++会自动从/usr/include和/usr/local/lib路径下寻找所需要的文件。
测试代码

#include <muduo/net/TcpServer.h>
#include <muduo/base/Logging.h>
#include <boost/bind.hpp>
#include <muduo/net/EventLoop.h>// 使用muduo开发回显服务器
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::TcpServer server_;
};EchoServer::EchoServer(muduo::net::EventLoop* loop,const muduo::net::InetAddress& listenAddr): 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)
{LOG_INFO << "EchoServer - " << conn->peerAddress().toIpPort() << " -> "<< 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(8888);EchoServer server(&loop, listenAddr);server.start();loop.loop();
}
g++ main.cpp -lmuduo_net -lmuduo_base -lpthread -std=c++11

等待客户端连接:

echo "hello world" | nc localhost 8888

muduo安装成功,能够正常进行C++网络程序开发~

参考博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ansible】role流程实验
  • 硬件基础知识
  • 2024 屡发屡中的论文方向:时空预测!
  • Spring 事务与 MySQL 事务:深度解析与实战指南
  • 【mysql面试题】mysql复习之常见面试题(二)
  • 手把手教你实现大模型RAG系列教程- 01大模型应用技术介绍
  • 股指期权交易详细基础介绍
  • Mac 搭建仓颉语言开发环境(Cangjie SDK)
  • 【homebrew安装】踩坑爬坑教程
  • sql中拼接操作
  • 计算机三级网络技术总结(五)
  • 昂科烧录器支持Senasic琻捷电子的蓝牙低功耗芯片SNP746
  • Linux 中的 Screen 命令详解
  • 基于yolov8的红外小目标无人机飞鸟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • 【从计算机的发展角度理解编程语言】C、CPP、Java、Python,是偶然还是应时代的产物?
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 2017 年终总结 —— 在路上
  • 30天自制操作系统-2
  • C# 免费离线人脸识别 2.0 Demo
  • CAP理论的例子讲解
  • chrome扩展demo1-小时钟
  • co模块的前端实现
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • iOS | NSProxy
  • JavaScript 基本功--面试宝典
  • JS字符串转数字方法总结
  • Next.js之基础概念(二)
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring-boot 启动时碰到的错误
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue学习系列(二)vue-cli
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 深度学习在携程攻略社区的应用
  • 优化 Vue 项目编译文件大小
  • Java数据解析之JSON
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #70结构体案例1(导师,学生,成绩)
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (4.10~4.16)
  • (pojstep1.3.1)1017(构造法模拟)
  • (备忘)Java Map 遍历
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (十三)MipMap
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 未来三学期想要修的课 (日記)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .a文件和.so文件
  • .Net 4.0并行库实用性演练
  • .Net MVC + EF搭建学生管理系统
  • .Net6使用WebSocket与前端进行通信
  • .net通过类组装数据转换为json并且传递给对方接口