muduo_net代码剖析之Acceptor
Acceptor用于接收client的连接请求,建立连接
1、Acceptor类简介
类Acceptor主要功能socket、bind、listen,并调用注册的回调函数来处理新到的连接
2、Acceptor连接建立
/处理时序图
1:当loop()函数监听到通道acceptChannel_有事件到来,即listen套接字可读时
2:acceptChannel_->handleEvent()
3:Acceptor::handleRead()
4:handleRead()函数中又调用了accept()接收客户端的请求
5:连接建立后,会调用注册的回调函数newConnectionCallback_()
Acceptor .h
头文件
class Acceptor : noncopyable
{public:typedef std::function<void (int sockfd, const InetAddress&)> NewConnectionCallback;Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport);~Acceptor();void setNewConnectionCallback(const NewConnectionCallback& cb){ newConnectionCallback_ = cb; }bool listenning() const { return listenning_; }void listen();private:void handleRead();EventLoop* loop_;Socket acceptSocket_; //监听套接字Channel acceptChannel_;//通道NewConnectionCallback newConnectionCallback_;bool listenning_;int idleFd_;
};
3、源码剖析
① 构造函数
Acceptor创建非阻塞的listen socket和channel,并且将Acceptor::handleRead函数设置为acceptChannel_的Read Callback
Acceptor::Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport): loop_(loop), //所属的loopacceptSocket_(sockets::createNonblockingOrDie(listenAddr.family())), //创建非阻塞的listen套接字acceptChannel_(loop, acceptSocket_.fd()), //创建监听Channellistenning_(false), //是否正在监听idleFd_(::open("/dev/null", O_RDONLY | O_CLOEXEC)) //预留idlefd
{assert(idleFd_ >= 0);acceptSocket_.setReuseAddr(true); //设置地址、端口复用acceptSocket_.setReusePort(reuseport);acceptSocket_.bindAddress(listenAddr); //bind//设置ReadCallback,下面在Acceptor::listen()中acceptChannel_.enableReading();//==>当acceptChannel_有读事件(接收到新连接)时,将调用回调函数Acceptor::handleRead()acceptChannel_.setReadCallback( std::bind(&handleRead, this));
}void Acceptor::handleRead()
{loop_->assertInLoopThread();InetAddress peerAddr;int connfd = acceptSocket_.accept(&peerAddr);//accept新连接if (connfd >= 0) //如果accept返回成功{if (newConnectionCallback_) //调用newConnectionCallback_回调函数{newConnectionCallback_(connfd, peerAddr);}else{sockets::close(connfd);}}else{LOG_SYSERR << "in Acceptor::handleRead";if (errno == EMFILE) //解决太多的文件描述符的错误:使用idlefd{::close(idleFd_); idleFd_ = ::accept(acceptSocket_.fd(), NULL, NULL); ::close(idleFd_); idleFd_ = ::open("/dev/null", O_RDONLY | O_CLOEXEC);}}
}
② Acceptor::listen()
,这个函数顾名思义,就是开始监听对端的连接请求
void Acceptor::listen()
{loop_->assertInLoopThread();listenning_ = true;acceptSocket_.listen();acceptChannel_.enableReading(); //关心读事件
}
③ 设置连接建立成功后的回调函数:setNewConnectionCallback
accept返回后,即连接建立成功后,会执行注册的newConnectionCallback_函数
//设置[连接建立成功的回调函数]
void setNewConnectionCallback(const NewConnectionCallback& cb)
{ newConnectionCallback_ = cb; }
4、示例代码
#include "Acceptor.h"
#include "EventLoop.h"
#include "InetAddress.h"
#include "SocketsOps.h"
#include <stdio.h>void newConnection(int sockfd, const muduo::InetAddress& peerAddr)
{printf("newConnection(): accepted a new connection from %s\n",peerAddr.toHostPort().c_str());::write(sockfd, "How are you?\n", 13);muduo::sockets::close(sockfd);
}int main()
{printf("main(): pid = %d\n", getpid());muduo::InetAddress listenAddr(9981);muduo::EventLoop loop;muduo::Acceptor acceptor(&loop, listenAddr);acceptor.setNewConnectionCallback(newConnection);acceptor.listen();loop.loop();
}
muduo_net代码剖析之Acceptor相关推荐
- x264代码剖析(一):图文详解x264在Windows平台上的搭建
x264代码剖析(一):图文详解x264在Windows平台上的搭建 X264源码下载地址:http://ftp.videolan.org/pub/videolan/x264/ 平台:win7 PC. ...
- x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()
x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode() 宏块编码函数x264_macroblock_encode()是完成变换与量化的主要函数,而x264_m ...
- HDFS集中式的缓存管理原理与代码剖析--转载
原文地址:http://yanbohappy.sinaapp.com/?p=468 Hadoop 2.3.0已经发布了,其中最大的亮点就是集中式的缓存管理(HDFS centralized cache ...
- x264代码剖析(四):vs2010编译x264错误集锦
x264代码剖析(四):vs2010编译x264错误集锦 支持VC++平台的x264的最新版本是x264-20091006,接下来就以该版本为例分析编译运行x264过程中遇到的问题以及解决办法. 1. ...
- 微信跳一跳刷分代码剖析
转载地址:http://blog.csdn.net/u013780605/article/details/78945239?ref=myrecommend 感谢学霸提供了这一途径,感谢原作者无私奉献. ...
- IDDPM原理和代码剖析
前言 Improved Denoising Diffusion Probabilistic Models(IDDPM) 是上一篇 Denoising Diffusion Probabilistic M ...
- windows下tomcat8启动脚本代码剖析--catalina.bat
Windows下,Tomcat可以以服务形式启动.停止,也可以执行脚本启动(startup.bat).停止(shutdown.bat).执行startup.bat时会调用catalina.bat,ca ...
- x264代码剖析(二):如何编译运行x264以及x264代码基本框架
x264代码剖析(二):如何编译运行x264以及x264代码基本框架 x264工程在x265出现之前一直在更新,但是自x264-20091007(含)不再支持VC++平台,也就是说支持VC++平台的x ...
- x264代码剖析(九):x264_encoder_encode()函数之x264_slice's'_write()函数
x264代码剖析(九):x264_encoder_encode()函数之x264_slice's'_write()函数 x264_encoder_encode()函数的核心函数就是x264_slice ...
最新文章
- TMS Scripter importtool的使用
- ATLAS入门篇之CascadingDropDown控件编程
- 确保***测试计划成功的10个秘诀(语录)
- 【SmartJob】启动问题查询
- 深圳的中学计算机课学什么时候,2018-2019年深圳中小学校历出炉 中小学校什么时候几号开学...
- 20175213 2018-2019-2 《Java程序设计》第4周学习总结
- [郑重声明]木草山人编码的习惯
- 简书UI易用性缺陷:投稿按钮太小
- 永久更改打开matlab时工作目录
- 桃李春风一杯酒,江湖夜雨十年灯。
- 网络爬虫法即将出台!!!小爬怡情,大爬over
- Android 微信登录 无法调起授权页面
- vnc repeater linux,远程桌面中转,基于 UltraVNC Repeater(中继器)的远程桌面服务搭建,用于复杂网络环境...
- WHM(Web Hosting Manager)/CPANEL 设置及linux 文件权限 经验
- Python可视化案例:Mutual Funds和ETFs对比
- Linux-数据库自动备份
- 恒大kk服务器信息端口,恒大kk手机客户端服务器
- Android开发实战《手机安全卫士》——12.“手机杀毒”模块实现 病毒数据库
- 云计算基础服务(四) http协议--虚拟主机
- 途牛2021年第二季度营收1.61亿元,预计第三季度同比至多下降10%
热门文章
- live555 dm368 rtsp
- UE4无法打开源文件“file_name.generated.h”(Cannot open source file name.generated.h)
- 计算机网络分类及其(从多角度分类)主要特点
- 单元测试junit+mock
- 计算机应用研究增刊征稿,计算机应用研究增刊_计算机应用_计算机工程与应用增刊...
- 精通CSS+DIV网页样式与布局--CSS段落效果
- 小知识:皮尔逊相关系数分析
- 基于 RISC-V SoC 的可配置 FFT 系统设计(1)引言
- sql server 2012 报表开发(1) 如何使用Reporting Service 2012制作报表
- 你不知道的云南隐藏景点