void TRawServer :: handleEvent(TPollEvent * pevents, int n) { for( int i = 0; i < n; i++ ) { int err = SOCKERR_NONE; TSocket * skp = (TSocket *)(pevents[i].data.ptr); UINT32 SelectFlags = skp->getSelectFlags(); waitevents_t wevt = pevents[i].events; if( (wevt & (EPOLLIN|EPOLLERR)) && (SelectFlags & SF_ACCEPT) == SF_ACCEPT) { wevt = XPOLLACC; } if( (wevt & (EPOLLOUT|EPOLLERR)) && (SelectFlags & SF_CONNECT) == SF_CONNECT) { socklen_t errlen = sizeof(err); getsockopt(skp->getHandle(), SOL_SOCKET, SO_ERROR, &err, &errlen); wevt = XPOLLCNX; } if(wevt & EPOLLERR) { wevt = SelectFlags; } if( WAIT_EVENT_READ( wevt ) ) { cout << "WAIT EVENT READ" << endl; skp->handleRead(); skp->setMaskRead(false); skp->setMaskWrite(true); m_poller->modSocket(skp); } else if( WAIT_EVENT_WRITE( wevt ) ) { cout << "WAIT EVENT WRITE" << endl; skp->handleWrite(); // pevents[i].data.ptr = NULL; m_poller->delSocket(skp); // delete skp; if( m_sparesockets.size() >= MAX_SPARE_SOCKETS ) { delete skp; } else { skp->closeSocket(); skp->setMaskRead(false); skp->setMaskWrite(false); m_sparesockets.push_back(skp); } } else if( WAIT_EVENT_ACCEPT( wevt ) ) { cout << "WAIT EVENT ACCEPT" << endl; string ipaddr; UINT16 port; sockobj_t sock = dynamic_cast<ListenSocket*>(m_listensocket)->Accept(ipaddr, port); if(INVALID_SOCKET != sock ) { TSocket *skp = NULL; if( !m_sparesockets.empty() ) { skp = m_sparesockets.front(); m_sparesockets.pop_front(); } else { skp = new TcpSocket(); } skp->attach(sock); skp->setMaskRead(true); m_poller->addSocket(skp); LOG(1)("connection from %s:%d\n", ipaddr.c_str(), port); cout <<"connection from " << ipaddr << ":"<< port << endl; } } else if( WAIT_EVENT_CONNECT( wevt ) ) { cout << "WAIT EVENT CONNECT" << endl; } else if( WAIT_EVENT_EXCEPT( wevt ) ) { cout << "WAIT EVENT EXCEPT" << endl; } } }