Ejemplo n.º 1
0
void LibEventMain::acceptfn(int listener, short event, void *arg) {
    EventHandler *processor = (EventHandler*) arg;
    LibEventMain *plevent = (LibEventMain*) processor->getParent();

    sockaddr_storage ss;
    socklen_t slen = sizeof(ss);
    // Investigate: Using a loop to accept connections makes it faster?
    int fd = accept(listener, (sockaddr*) &ss, &slen);
    if (fd < 0) {
        // Investigate: Should check EWOULDBLOCK and EAGAIN?
        perror("accept");
        return;
    }
    INFO_OUT("Client connected on fd %d\n", fd);

    bufferevent *bev;
    evutil_make_socket_nonblocking(fd);
    bev = bufferevent_socket_new(plevent->m_ebase, fd, BEV_OPT_CLOSE_ON_FREE);
    processor->setContext((Context*) bev);
    bufferevent_setcb(bev, readfn, NULL, errorfn, arg);
    bufferevent_setwatermark(bev, EV_READ, 0, max_buff);
    bufferevent_enable(bev, EV_READ | EV_WRITE);

}