Acceptor.cc revision bfe73648
1bfe73648SShuo Chen// excerpts from http://code.google.com/p/muduo/
2bfe73648SShuo Chen//
3bfe73648SShuo Chen// Use of this source code is governed by a BSD-style license
4bfe73648SShuo Chen// that can be found in the License file.
5bfe73648SShuo Chen//
6bfe73648SShuo Chen// Author: Shuo Chen (chenshuo at chenshuo dot com)
7bfe73648SShuo Chen
8bfe73648SShuo Chen#include "Acceptor.h"
9bfe73648SShuo Chen
10bfe73648SShuo Chen#include "logging/Logging.h"
11bfe73648SShuo Chen#include "EventLoop.h"
12bfe73648SShuo Chen#include "InetAddress.h"
13bfe73648SShuo Chen#include "SocketsOps.h"
14bfe73648SShuo Chen
15bfe73648SShuo Chen#include <boost/bind.hpp>
16bfe73648SShuo Chen
17bfe73648SShuo Chenusing namespace muduo;
18bfe73648SShuo Chen
19bfe73648SShuo ChenAcceptor::Acceptor(EventLoop* loop, const InetAddress& listenAddr)
20bfe73648SShuo Chen  : loop_(loop),
21bfe73648SShuo Chen    acceptSocket_(sockets::createNonblockingOrDie()),
22bfe73648SShuo Chen    acceptChannel_(loop, acceptSocket_.fd()),
23bfe73648SShuo Chen    listenning_(false)
24bfe73648SShuo Chen{
25bfe73648SShuo Chen  acceptSocket_.setReuseAddr(true);
26bfe73648SShuo Chen  acceptSocket_.bindAddress(listenAddr);
27bfe73648SShuo Chen  acceptChannel_.setReadCallback(
28bfe73648SShuo Chen      boost::bind(&Acceptor::handleRead, this));
29bfe73648SShuo Chen}
30bfe73648SShuo Chen
31bfe73648SShuo Chenvoid Acceptor::listen()
32bfe73648SShuo Chen{
33bfe73648SShuo Chen  loop_->assertInLoopThread();
34bfe73648SShuo Chen  listenning_ = true;
35bfe73648SShuo Chen  acceptSocket_.listen();
36bfe73648SShuo Chen  acceptChannel_.enableReading();
37bfe73648SShuo Chen}
38bfe73648SShuo Chen
39bfe73648SShuo Chenvoid Acceptor::handleRead()
40bfe73648SShuo Chen{
41bfe73648SShuo Chen  loop_->assertInLoopThread();
42bfe73648SShuo Chen  InetAddress peerAddr(0);
43bfe73648SShuo Chen  //FIXME loop until no more
44bfe73648SShuo Chen  int connfd = acceptSocket_.accept(&peerAddr);
45bfe73648SShuo Chen  if (connfd >= 0)
46bfe73648SShuo Chen  {
47bfe73648SShuo Chen    // string hostport = peerAddr.toHostPort();
48bfe73648SShuo Chen    // LOG_TRACE << "Accepts of " << hostport;
49bfe73648SShuo Chen    if (newConnectionCallback_)
50bfe73648SShuo Chen    {
51bfe73648SShuo Chen      newConnectionCallback_(connfd, peerAddr);
52bfe73648SShuo Chen    }
53bfe73648SShuo Chen    else
54bfe73648SShuo Chen    {
55bfe73648SShuo Chen      sockets::close(connfd);
56bfe73648SShuo Chen    }
57bfe73648SShuo Chen  }
58bfe73648SShuo Chen}
59bfe73648SShuo Chen
60