muduo库 Acceptor

头文件

#include"Acceptor.h"
#include"Logger.h"
#include"InetAddress.h"

#include<unistd.h>
#include<errno.h>
#include<sys/socket.h>
#include<sys/types.h>



static int createNonblocking()
{   //IPPROTO_TCP 改成0
    int sockfd = socket(AF_INET,SOCK_CLOEXEC|SOCK_NONBLOCK|SOCK_STREAM,0);
    if(sockfd<0)
    {
        LOG_FATAL("%s:%s:%d listen sockfd creat error:%d\n",__FILE__,__func__,__LINE__,errno);
    }
    //个人认为需要加上这句
    return sockfd;
}


Acceptor::Acceptor(EventLoop*loop,const InetAddress &listenAddr,bool reuseport)
    : loop_(loop)
    , acceptSocket_(createNonblocking())
    , acceptChannel_(loop,acceptSocket_.fd())
    , listenning_(false)
{
    acceptSocket_.setReuseAddr(true);
    acceptSocket_.setReusePort(true);
    acceptSocket_.bindAddress(listenAddr);
    //TcpServer::start() Acceptor.listen 有新用户连接,要执行一个回调
    //baseloop => accpetChannel_(listen)
    acceptChannel_.setReadCallback(std::bind(&Acceptor::handleRead,this));
}
Acceptor::~Acceptor()
{
    acceptChannel_.disableAll();
    acceptChannel_.remove();
}


void Acceptor::listen()
{
    listenning_=true;
    acceptSocket_.listen();
    acceptChannel_.enableReading();
}


void Acceptor::handleRead()
{
    InetAddress peerAddr;
    LOG_INFO(" jin ru acceptor:: handleRead!!!!!!!!!!!!!\n");
    int connfd = acceptSocket_.accept(&peerAddr);
    if(connfd>=0)
    {
        if(newConnectionCallback_)
        {
            LOG_INFO("in acceptir : is going to using newconnectioncallback!!!!!!!!!\n");
            newConnectionCallback_(connfd,peerAddr);//轮询找到subloop,唤醒,分发当前的新客户端的Channel
        }
        else
        {
            ::close(connfd);
        }
    }
    else
    {
        LOG_ERROR("%s:%s:%d listen sockfd creat error:%d\n",__FILE__,__func__,__LINE__,errno);
        if(errno==EMFILE)
        {
            LOG_ERROR("%s:%s:%d  sockfd reached limit:%d\n",__FILE__,__func__,__LINE__,errno);
        }
    }

}

cc文件

#pragma once
#include "noncopyable.h"
#include "Socket.h"
#include "Channel.h"

#include <functional>

class EventLoop;
class InetAddress;

class Acceptor : noncopyable
{
public:
    using NewConnectionCallback = std::function<void(int sockfd, const InetAddress&)>;
    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_; // Acceptor用的就是用户定义的那个baseLoop,也称作mainLoop
    Socket acceptSocket_;
    Channel acceptChannel_;
    NewConnectionCallback newConnectionCallback_;
    bool listenning_;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值