您的位置:首页 > 娱乐 > 明星 > 泰州专业做网站的公司_企业建站系统漏洞_seo网站优化培训找哪些_网站推广去哪家比较好

泰州专业做网站的公司_企业建站系统漏洞_seo网站优化培训找哪些_网站推广去哪家比较好

2024/12/23 1:46:58 来源:https://blog.csdn.net/2301_79181030/article/details/142643795  浏览:    关键词:泰州专业做网站的公司_企业建站系统漏洞_seo网站优化培训找哪些_网站推广去哪家比较好
泰州专业做网站的公司_企业建站系统漏洞_seo网站优化培训找哪些_网站推广去哪家比较好

欢迎来到 破晓的历程的 博客

⛺️不负时光,不负己✈️

文章目录

    • 引言
    • 何为「muduo库」
    • 安装muduo库
    • 阻塞、非阻塞、同步、异步
      • 数据准备
      • 数据准备

引言

从本篇博客开始,我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注!!

何为「muduo库」

muduo库是 陈硕 大神个人开发的 C++ 的 TCP 网络编程库。muduo 基于 Reactor 模式实现,Reactor 模式也是目前大多数 Linux 端高性能网络编程框架和网络应用所选择的主要架构,例如 Redis 和 Java 的 Netty 库等。

注意:目前muduo库仅可以在Linux环境下使用,因为:陈硕大师在写muduo库时,不考虑可意志性,不跨平台,只支持Linux,不支持windows。

安装muduo库

这里我贴一篇安装muduo库的详细教程:muduo库的安装和使用

为了让大家了解muduo库使用起来是如何的方便,我写一段示例代码,用不到20行的代码量快速构建一个Linux环境下的TCP服务器

#include<muduo/net/TcpServer.h>
#include<muduo/net/EventLoop.h>
#include<iostream>
using namespace muduo;
using namespace muduo::net;
using namespace std;
void onMessage(const TcpConnectionPtr &conn,Buffer *buf,Timestamp time)
{conn->send(buf);
}
int main()
{EventLoop Loop;InetAddress listenAddr("127.0.0.1",6000);TcpServer server(&Loop,listenAddr,"chatServer");server.setMessageCallback(onMessage);server.start();Loop.loop();
}

我们可以用telnet充当客户端,连接服务器,进行通信,这段代码的效果是:服务器将客户端发来的数据再发送给客户端。

如果我们使用网络通信AP创建套接字,然后通信的话,代码量肯定远不止20行,所以这就是使用网络库封装的函数的显著效果。可能大家看这段代码会一脸懵。别担心,我刚一开始接触这个库的时候也是如此,当我们认真学习了muduo库,我们不禁会发现:陈硕大神设计的太妙了。

阻塞、非阻塞、同步、异步

一个典型的IO过程分为哪两个阶段? 数据准备和数据读取

数据准备

根据系统IO操作的就绪状态,分为:

  • 阻塞状态

  • 非阻塞状态

大家都使用过recv这个系统API接口。这个接口默认就是阻塞式读取数据。那么阻塞式等待数据就绪时是什么表现呢?

当数据没有准备好时,recv会阻塞式等待,造成该线程什么也做不了,就造成了线程阻塞。

但是我们可以通过系统接口将一个文件描述符设置为非阻塞状态「由于这不是本篇博客的重点,这里就不再详细介绍这个过程了」那么非阻塞等待数据就绪有什么表现呢?

1.当数据没有准备好时,recv会返回-1,同时将error设置为 EAGAIN 「表示数据还没有准备就绪,但没有发生错误」
2.当读取操作发生错误时,读取失败,recv返回0.
3.当读取成功时,返回读取数据的数量「字节数」。

数据准备

根据应用程序和内核的交互方式,分为:

  • 同步

  • 异步

对于同步读取数据而言,代表函数就是recv。当数据读取时,线程阻塞等待,消耗的时间属于应用程序。然后将数据从内核缓冲区搬到应用程序的缓冲区


对于异步读取数据时,我们关系的是将数据从操作系统内核缓冲区搬到应用层缓冲区,于是就将这一需求告诉操作系统,让操作系统完成这件事情,等到完成之后,再让其用我们注册的通知函数,通知应用程序,此时读取数据花费的时间就不属于应用程序,而属于操作系统了,在操作系统读取数据期间,应用程序线程可以做其他事情,等到数据读取完毕,应用程序只负责对数据进行处理就可以了。

Tips:异步通知中,我们通常使用回调函数的方式进行通知

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com