Ejemplo n.º 1
0
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;
		}
	}
}