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相关推荐

  1. x264代码剖析(一):图文详解x264在Windows平台上的搭建

    x264代码剖析(一):图文详解x264在Windows平台上的搭建 X264源码下载地址:http://ftp.videolan.org/pub/videolan/x264/ 平台:win7 PC. ...

  2. x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()

    x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode() 宏块编码函数x264_macroblock_encode()是完成变换与量化的主要函数,而x264_m ...

  3. HDFS集中式的缓存管理原理与代码剖析--转载

    原文地址:http://yanbohappy.sinaapp.com/?p=468 Hadoop 2.3.0已经发布了,其中最大的亮点就是集中式的缓存管理(HDFS centralized cache ...

  4. x264代码剖析(四):vs2010编译x264错误集锦

    x264代码剖析(四):vs2010编译x264错误集锦 支持VC++平台的x264的最新版本是x264-20091006,接下来就以该版本为例分析编译运行x264过程中遇到的问题以及解决办法. 1. ...

  5. 微信跳一跳刷分代码剖析

    转载地址:http://blog.csdn.net/u013780605/article/details/78945239?ref=myrecommend 感谢学霸提供了这一途径,感谢原作者无私奉献. ...

  6. IDDPM原理和代码剖析

    前言 Improved Denoising Diffusion Probabilistic Models(IDDPM) 是上一篇 Denoising Diffusion Probabilistic M ...

  7. windows下tomcat8启动脚本代码剖析--catalina.bat

    Windows下,Tomcat可以以服务形式启动.停止,也可以执行脚本启动(startup.bat).停止(shutdown.bat).执行startup.bat时会调用catalina.bat,ca ...

  8. x264代码剖析(二):如何编译运行x264以及x264代码基本框架

    x264代码剖析(二):如何编译运行x264以及x264代码基本框架 x264工程在x265出现之前一直在更新,但是自x264-20091007(含)不再支持VC++平台,也就是说支持VC++平台的x ...

  9. x264代码剖析(九):x264_encoder_encode()函数之x264_slice's'_write()函数

    x264代码剖析(九):x264_encoder_encode()函数之x264_slice's'_write()函数 x264_encoder_encode()函数的核心函数就是x264_slice ...

最新文章

  1. TMS Scripter importtool的使用
  2. ATLAS入门篇之CascadingDropDown控件编程
  3. 确保***测试计划成功的10个秘诀(语录)
  4. 【SmartJob】启动问题查询
  5. 深圳的中学计算机课学什么时候,2018-2019年深圳中小学校历出炉 中小学校什么时候几号开学...
  6. 20175213 2018-2019-2 《Java程序设计》第4周学习总结
  7. [郑重声明]木草山人编码的习惯
  8. 简书UI易用性缺陷:投稿按钮太小
  9. 永久更改打开matlab时工作目录
  10. 桃李春风一杯酒,江湖夜雨十年灯。
  11. 网络爬虫法即将出台!!!小爬怡情,大爬over
  12. Android 微信登录 无法调起授权页面
  13. vnc repeater linux,远程桌面中转,基于 UltraVNC Repeater(中继器)的远程桌面服务搭建,用于复杂网络环境...
  14. WHM(Web Hosting Manager)/CPANEL 设置及linux 文件权限 经验
  15. Python可视化案例:Mutual Funds和ETFs对比
  16. Linux-数据库自动备份
  17. 恒大kk服务器信息端口,恒大kk手机客户端服务器
  18. Android开发实战《手机安全卫士》——12.“手机杀毒”模块实现 病毒数据库
  19. 云计算基础服务(四) http协议--虚拟主机
  20. 途牛2021年第二季度营收1.61亿元,预计第三季度同比至多下降10%

热门文章

  1. live555 dm368 rtsp
  2. UE4无法打开源文件“file_name.generated.h”(Cannot open source file name.generated.h)
  3. 计算机网络分类及其(从多角度分类)主要特点
  4. 单元测试junit+mock
  5. 计算机应用研究增刊征稿,计算机应用研究增刊_计算机应用_计算机工程与应用增刊...
  6. 精通CSS+DIV网页样式与布局--CSS段落效果
  7. 小知识:皮尔逊相关系数分析
  8. 基于 RISC-V SoC 的可配置 FFT 系统设计(1)引言
  9. sql server 2012 报表开发(1) 如何使用Reporting Service 2012制作报表
  10. 你不知道的云南隐藏景点