1.Acceptor

(1)Acceptor用于accept(2)接受TCP连接

(2)Acceptor的数据成员包括Socket、Channel,Acceptor的socket是listening socket(即serversocket)。Channel用于观察此socket的readable事件,并回调Accptor::handleRead(),后者调用accept(2)来接受新连接,并回调用户callback。

2.代码

1.Acceptor.h

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)
//
// This is an internal header file, you should not include this.#ifndef MUDUO_NET_ACCEPTOR_H
#define MUDUO_NET_ACCEPTOR_H#include <boost/function.hpp>
#include <boost/noncopyable.hpp>#include <muduo/net/Channel.h>
#include <muduo/net/Socket.h>namespace muduo
{
namespace net
{class EventLoop;
class InetAddress;///
/// Acceptor of incoming TCP connections.
///
class Acceptor : boost::noncopyable
{public:typedef boost::function<void (int sockfd,const InetAddress&)> NewConnectionCallback;Acceptor(EventLoop* loop, const InetAddress& listenAddr);~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_;
};}
}#endif  // MUDUO_NET_ACCEPTOR_H

2.Acceptor.cc

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)#include <muduo/net/Acceptor.h>#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/SocketsOps.h>#include <boost/bind.hpp>#include <errno.h>
#include <fcntl.h>
//#include <sys/types.h>
//#include <sys/stat.h>using namespace muduo;
using namespace muduo::net;Acceptor::Acceptor(EventLoop* loop, const InetAddress& listenAddr): loop_(loop),acceptSocket_(sockets::createNonblockingOrDie()),acceptChannel_(loop, acceptSocket_.fd()),listenning_(false),idleFd_(::open("/dev/null", O_RDONLY | O_CLOEXEC))
{assert(idleFd_ >= 0);acceptSocket_.setReuseAddr(true);acceptSocket_.bindAddress(listenAddr);acceptChannel_.setReadCallback(boost::bind(&Acceptor::handleRead, this));
}Acceptor::~Acceptor()
{acceptChannel_.disableAll();acceptChannel_.remove();::close(idleFd_);
}void Acceptor::listen()
{loop_->assertInLoopThread();listenning_ = true;acceptSocket_.listen();acceptChannel_.enableReading();
}void Acceptor::handleRead()
{loop_->assertInLoopThread();InetAddress peerAddr(0);//FIXME loop until no moreint connfd = acceptSocket_.accept(&peerAddr);if (connfd >= 0){// string hostport = peerAddr.toIpPort();// LOG_TRACE << "Accepts of " << hostport;if (newConnectionCallback_){newConnectionCallback_(connfd, peerAddr);}else{sockets::close(connfd);}}else{// Read the section named "The special problem of// accept()ing when you can't" in libev's doc.// By Marc Lehmann, author of livev.if (errno == EMFILE){::close(idleFd_);idleFd_ = ::accept(acceptSocket_.fd(), NULL, NULL);::close(idleFd_);idleFd_ = ::open("/dev/null", O_RDONLY | O_CLOEXEC);}}
}

3.Accepotr示例

void newConnection(int sockfd, const InetAddress& peerAddr)
{printf("newConnection(): accepted a new connection from %s\n",peerAddr.toIpPort().c_str());::write(sockfd, "How are you?\n", 13);sockets::close(sockfd);
}int main()
{printf("main(): pid = %d\n", getpid());InetAddress listenAddr(8888);EventLoop loop;Acceptor acceptor(&loop, listenAddr);acceptor.setNewConnectionCallback(newConnection);acceptor.listen();loop.loop();
}

32muduo_net库源码分析(八)相关推荐

  1. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)

    大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...

  2. Android主流三方库源码分析(九、深入理解EventBus源码)

    一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...

  3. 【转】ABP源码分析八:Logger集成

    ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...

  4. sigslot库源码分析

    言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...

  5. surprise库源码分析

    最近工作上需要使用到协同过滤,来计算相似度,因此根据https://blog.csdn.net/weixin_43849063/article/details/111500236的步骤对surpris ...

  6. Python Requests库源码分析

    1. Requests库简介 书籍是人类进步的阶梯,源码是程序员进步的阶梯.为了进步,我们就要不断地阅读源码,提升自己的技术水平.今天我们来剖析一下Python的Requests库. Requests ...

  7. Spring Security源码分析八:Spring Security 退出

    为什么80%的码农都做不了架构师?>>> Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spr ...

  8. Spring源码分析八:Mybatis ORM映射框架原理

    文章目录 (一)Mybatis单独操作数据库程序 1.1.数据库表 1.2.建立PO 1.3.建立mapper接口映射 1.4.建立Mybatis配置文件 1.5.建立mapper映射文件 1.6.测 ...

  9. mybatis的使用及源码分析(八) mybatis的rowbounds分析

    Mybatis提供了一个简单的逻辑分页类RowBounds,其原理类似于在内存中做了一个分页,不是数据库层面的分页,性能不算好,谨慎使用 一. RowBounds源码分析 1 RowBounds源码: ...

最新文章

  1. x264各个版本下载
  2. 一个高效的内存池实现
  3. 【转】CreateWindowEx异常原因汇总
  4. Java高并发编程:Copy-On-Write容器
  5. Tomcat企业级应用
  6. iis 改了php ini不生效,Windows IIS 集成PHP时修改PHP.ini 配置后不生效问题
  7. 2019年总结:把能努力的都努力好,最终等待命运垂青
  8. 包概念与__init__注意事项
  9. 信息学奥赛C++语言: 素数回文数的个数
  10. 网络采集软件核心技术剖析系列(1)---如何使用C#语言获取博客园某个博主的全部随笔链接及标题...
  11. Java多线程详解(深究Thread类)
  12. Nothing is impossible!——致敬Uzi
  13. 【中医学】11 常见病证-3:虚劳:月经不调:痛经:崩漏:带下:痄腮:疳症:湿疹:肠痈...
  14. html submit提交事件,submit方法与onsubmit事件
  15. 看理想:3万辆交付意味着什么?
  16. python2到100的素数_python输出2到100之间的素数
  17. 【关于Spring那些事】——与君初相识
  18. canvas教程4-canvas的绘制功能
  19. 谷歌浏览器访问https请求总是显示不安全提示
  20. 路由器配置和静态路由

热门文章

  1. NFS服务的端口分配
  2. Ponemon:优化SIEM时所面临的挑战
  3. 烂泥:SQL Server 2005数据库安装
  4. 可视化Python编译软件:GUI2Exe
  5. Shell 中 exit 和 return 的区别
  6. 一个页面上多个form表单的用json数据格式提交到后台
  7. Flink FileSink 自定义输出路径——BucketingSink
  8. C++ Primer 第十三章 拷贝控制
  9. 总结Cnblogs支持的常用Markdown语法
  10. 递推DP URAL 1119 Metro