Muduo库编译学习(1)

1.muduo库简介

muduo是由Google大佬陈硕开发,是一个基于非阻塞IO和事件驱动的现代C++网络库,原生支持one loop per thread这种IO模型,该库只支持Linux系统,网上大佬对其褒贬不一,作为小白用来学习就无可厚非了。
git仓库:https://github.com/chenshuo/muduo

2.准备事项

  1. muduo采用Cmake为build system,安装如下:
$ sudo apt-get install cmake
  1. muduo依赖于Boost,安装如下:
$ sudo apt-get install libboost-dev libboost-test-dev
  1. curl、c-ares DNS、Google Protobuf这3个库非必须安装,如果安装了cmake会多编译一些示例,安装如下:
$ sudo apt-get install libcur14-openssl-dev libc-ares-dev
$ sudo apt-get install protobuf-compiler libprotobuf-dev

3.编译

  1. 下载muduo-master解压后,执行编译脚本
// 切换路径
$ cd muduo-master/
//编译muduo库,默认release版,生成build文件夹
$ ./build.sh -j2
// 将muduo头文件和库文件安装到release-install目录下的include和lib文件夹
$ ./build.sh install
// 将头文件拷贝到系统路径
$ cd build/release-install-cpp11/include/
$ cp -r muduo/ /usr/local/include/
// 将库文件拷贝到系统路径
$ cd build/release-install-cpp11/lib/
$ cp * /usr/local/lib/

4.测试demo

  1. EchoServer.h
#include <muduo/net/TcpServer.h>
#include <muduo/base/Logging.h>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_;};
  1. EchoServer.cpp
#include "EchoServer.h"
#include <boost/bind/bind.hpp>using namespace boost::placeholders;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::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);
}void EchoServer::start()
{server_.start();
}
  1. test.cpp
#include "EchoServer.h"#include <muduo/net/EventLoop.h>
#include <muduo/base/Logging.h>using namespace muduo;
using namespace muduo::net;int main()
{LOG_INFO << "pid = "<< getpid();muduo::net::EventLoop loop;muduo::net::InetAddress listenAddr(2007);EchoServer server(&loop,listenAddr);server.start();loop.loop();
}
  1. 在编译的时候出现好多未定义的错误,最后排查是因为编译的时候链接库的顺序有要求,编译如下:
$ g++ EchoServer.cpp test.cpp -o test -lmuduo_base -lmuduo_net -lpthread

错误消息如下:
在这里插入图片描述

5.测试

执行test.out程序启动服务端,再通过终端模拟客户端建立连接,在客户端发送消息会同时接收服务端回复的相同消息。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

b站小土堆pytorch学习记录——P14 torchvision中的数据集使用

文章目录 一、前置知识如何查看torchvision的数据集 二、代码&#xff08;附注释&#xff09;及运行结果 一、前置知识 如何查看torchvision的数据集 &#xff08;1&#xff09;打开官网 https://pytorch.org/ pytorch官网 &#xff08;2&#xff09;打开torchvision 在Do…

Linux:top显示信息

简介 top命令是Linux系统中常用的性能监控工具&#xff0c;它可以实时显示系统中各个进程的CPU使用情况以及其他系统资源的使用情况。当您在终端中运行top命令时&#xff0c;它会显示一个实时更新的列表。 CPU相关的信息 CPU状态&#xff1a; us&#xff08;user&#xff09…

梯度和梯度损失

梯度主要用于计算图像融合过程中的梯度损失&#xff0c;对应的损失函数是梯度损失&#xff08;loss_grad&#xff09;。 梯度的作用&#xff1a; 图像的梯度是指图像中每个像素的灰度变化率&#xff0c;通常用于表示图像的边缘和纹理信息。在图像融合任务中&#xff0c;通过计算…

Unity游戏输入系统(新版+旧版)

使用新版还是旧版 旧版 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c5 : MonoBehaviour {void Start(){}void Update(){// 注意要在游戏中 点鼠标键盘进行测试// 鼠标// 0左键 1右键 2滚轮if (Input.GetMouseButtonDown(0)…

【javaSE-语法】lambda表达式

【javaSE-语法】lambda表达式 1. 先回忆一下&#xff1a;1.1 接口不能直接通过关键字new进行实例化1.2 函数式接口1.3 匿名内部类1.31 匿名内部类在代码中长啥样&#xff1f;1.32 构造一个新的对象与构造一个扩展了某类的匿名内部类的对象&#xff0c;两者有什么区别&#xff1…

maven--->maven中的<properties>属性有什么作用?

&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c; 在Maven中&#xff0c;元素用于定义项目中可重用的属性值。这些属性值可以在项目的POM文件中被引用&#xff0c;以便在整个项目中统一管理和使用。通过使用元素&#xff0c;可以避免在POM文件…

SpringBean生命周期之InitializingBean,初始化bean

1 yml文件 weixin:appid: aaaaaapartner: 12313214partnerkey: ccccccert: C:\\Users\\lenovo\\Desktop 2 Bean初使化 import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframewor…

midjourney提示词语法

更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中&#xff0c;以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…

YOLOv6、YOLOv7、YOLOv8网络结构图(清晰版)

承接上一篇博客&#xff1a;YOLOv3、YOLOv4、YOLOv5、YOLOx的网络结构图(清晰版)_yolox网络结构图-CSDN博客 1. YOLOv6网络结构图 2. YOLOv7网络结构图 3. YOLOv8网络结构图

搭建 LNMP 架构

一 理论知识 &#xff08;一&#xff09;架构图 &#xff08;二&#xff09;CGI 由来 最早的Web服务器只能简单她响应浏览器发来的HTTP请求&#xff0c;并将存储在服务器上的HTML文件返回给浏览器&#xff0c;也就是静态html文件&#xff0c;但是后期随着网站功能增多网站开…

c++阶梯之模板初阶

1. 泛型编程 void Swap(int& x, int& y) {int tmp x;x y;y tmp; }void Swap(double& x, double& y) {double tmp x;x y;y tmp; }void Swap(char& x, char& y) {char tmp x;x y;y tmp; } int main() {int a 10, b 20;double c 1.1, d 2.2…

《Spring Security 简易速速上手小册》第7章 REST API 与微服务安全(2024 最新版)

文章目录 7.1 保护 REST API7.1.1 基础知识详解7.1.2 重点案例&#xff1a;使用 JWT 进行身份验证和授权案例 Demo 7.1.3 拓展案例 1&#xff1a;API 密钥认证案例 Demo测试API密钥认证 7.1.4 拓展案例 2&#xff1a;使用 OAuth2 保护 API案例 Demo测试 OAuth2 保护的 API 7.2 …

读书笔记-三国演义-夏侯惇

夏侯惇&#xff08;公元夏侯惇&#xff08;公元190年-公元220年&#xff09;&#xff0c;字元让&#xff0c;沛国谯县&#xff08;今安徽亳州市&#xff09;人&#xff0c;是中国东汉末年至三国时期魏国重要将领之一。他是曹操麾下的得力将领&#xff0c;以勇猛忠诚而闻名于世。…

linux安装matlab获取许可证

1.点击许可证 2. 3. 4. 4.主机ID 打开linux输入 /sbin/ifconfigether后边的就是 6.计算机登录名 打开linux输入 whoami7. 8. 9.

局域网https自签名教程

们的客户是在内网环境里面&#xff0c;所以就只能用自签名证书来搞&#xff0c;我一想这还不容易&#xff0c;就迅速的百度了一下随便找了个文章开始照猫画虎&#xff0c;很快就弄完了&#xff0c;但是弄完后发现还是有问题&#xff0c;而且https 还是报不安全&#xff0c; 1、…

(规划)24届春招和25届暑假实习路线准备规划

春招&&暑假实习&#xff1a; 1.八股&#xff1a; 可以去一些八股网站上面进行阅读。 2.项目&#xff1a;至少准备1-2个项目&#xff0c;可以条理清晰的进行项目介绍和难点剖析。 3.算法&#xff1a; hot100 &#xff0c;剑指offer 能刷的很熟&#xff0c;算法关就差…

【R包报错】使用sceasy包转换rds文件与h5ad文件报错PyType_GetFlags

想要将scanpy的h5ad文件转为rds文件&#xff0c;有一个很方便的包sceasy可以使用&#xff0c;安装简单&#xff0c;代码简易。 安装方式 # bioconda package:conda install -c bioconda r-sceasy# R package:devtools::install_github("cellgeni/sceasy")#额外需要…

android系统开发之--ROM编译,repo使用指南

1、检出代码&#xff0c;指定git指定的分支和manifest repo init -u git://xxx/xxx/manifest.git -b <BRANCH> -m <MANIFEST> 这里-m和-b的含义是&#xff1a; 1. 注意到manifest.git本身也是一个git project 2. 所以&#xff0c;-b指定的是使用#1中这个git proj…

我的相关奖项

博士录取证明 名单第53&#xff1a;https://yzb.bupt.edu.cn/content/content.php?p2_2_651 论文链接 第一篇&#xff1a;https://doi.org/10.1186/s13677-022-00373-8 第二篇&#xff1a;https://doi.org/10.1016/j.ipm.2022.103167 第三篇&#xff1a;https://doi.org/10…

Unity 脚本-生命周期常用函数

在Unity中&#xff0c;万物皆是由组件构成的。 右键创建C&#xff03;脚本&#xff0c;拖动脚本到某物体的组件列表。 生命周期相关函数 using System.Collections; using System.Collections.Generic; using UnityEngine;// 必须要继承 MonoBehaviour 才是一个组件 // 类名…