void Epoll::DispatchEvent()
		{
			int fds = epoll_wait(epfd_, evts_, size_, 1000); 

			if (fds == -1){

				if (errno == EINTR)
					return;

				throw Exception("Epoll epoll_wait failed, ");

			}

			for (int i = 0; i < fds; ++i)
			{

				EventHandler* handler = reinterpret_cast<EventHandler*>(evts_[i].data.ptr);

				if (evts_[i].events & EventHandler::READ_MASK)
				{

					if (handler->Receive() == -1)

						handler->Close();

				}

				if (evts_[i].events & EventHandler::WRITE_MASK)
				{

					if (handler->Send() == -1){

						Trace("TRACE SENDSENDSENDSENDSENDSENDSENDSENSEND");

						handler->Close();

					}


				}
			}

			//timer: gettimeofday
			gettimeofday(&now_, NULL);

			if(now_.tv_sec - before_.tv_sec >= INTERVAL){

				TimeQ::iterator iter = TimerQueue::timeq().begin();

				for(; iter != TimerQueue::timeq().end(); ){

					EventHandler* handler = iter->first;	

					//Note("TimeQueue: sum=%d, handler=%p", TimerQueue::timeq().size(), handler);

					iter->second = iter->second - INTERVAL;

					if(0 == (iter->second % HEARTBEAT)){

						//heartbeat

						if(NULL != handler){

							handler->Send();

						}

					}

					bool flag = false;

					TimeQ::iterator it = iter;

					it++;

					if(iter->second - INTERVAL < 0){

						if(NULL != handler){

							handler->Timeout(flag);						
						}

						iter->second = TimerQueue::threshold();

					}

					iter = it;
				}

				gettimeofday(&before_, NULL);

			}

		}
		/*=========================================================
		 * @public
		 =========================================================*/
		int FightRequestService::Process(boost::shared_ptr<C2S_FightRequest> _item UNUSED, EventHandler* _handler){


			Note("FightRequest : roleid=%s, froleid=%s", _item->roleid().c_str(), _item->froleid().c_str());

			//int roleid = StringTool::Str2Int(_item->roleid());

			//int froleid = StringTool::Str2Int(_item->froleid());

			boost::shared_ptr<S2C_FightRequest> response(new S2C_FightRequest());

			EventHandler* buddy = Registry::QueryHandler(_item->froleid());

			if(NULL == buddy){
			
				Error("Can't Find Buddy!");

				//+++++++++++++++++++++++++++++++++++++
				//Add NoT Found Status, and send back
				//+++++++++++++++++++++++++++++++++++++

				return -1;

			}

			response->set_roleid(_item->roleid());

			response->set_froleid(_item->froleid());

			char* buf = new char[response->ByteSize()];

			*buf = 0;

			//Send
			Head head;

			head.type = FIGHTREQUEST;

			head.version = 1;

			*buf = 0;

			head.length = response->ByteSize();

			response->SerializeToArray(buf, head.length);

			if(ESTABLISHED == _handler->Connected()){

				_handler->Send(head, buf, head.length);
			
			}

			if(ESTABLISHED == Registry::QueryHandler(_item->froleid())->Connected()){

				buddy->Send(head, buf, head.length);

			}

			delete buf;

			return 1;


		}