// TimingWheel.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <io.h>
#include <vector>
#include <algorithm>
#include <windows.h>
#define SAFEDELETE(pointer) if(pointer){delete pointer;pointer=NULL;}
interface IReadEvent
{
virtual void readEvent() = 0;
};
class FdBucket;
class TimeWheel;
class Fd : public IReadEvent
{
int fd;
FdBucket * _manager;
public:
void readEvent();
Fd(int _fd){this->fd = _fd;_manager = 0;}
operator int()const{return fd;}
void setManager(FdBucket * manager){_manager = manager;}
};
int Read(Fd fd , char * buffer , int max_count)
{
int read_count = _read((int)fd , buffer , max_count);
fd.readEvent();
return read_count;
}
class FdBucket
{
std::vector<Fd *> fds;
TimeWheel * _manager;
public:
void readEvent(Fd * fd);
int clearFds()
{
std::vector<Fd *> all = fds;
fds.clear();
wchar_t buffer[] = L"由于长时间没有操作,你被踢出了服务器";
for ( std::vector<Fd *>::iterator it = all.begin() ; it != all.end() ; ++it )
{
_write((int)(*(*it)) , buffer , sizeof(buffer));
_close((int)(*(*it)));
SAFEDELETE(*it);
}
return all.size();
}
Fd * add(Fd * _fd)
{
fds.push_back(_fd);
_fd->setManager(this);
return _fd;
}
void setManager(TimeWheel * tw)
{
_manager = tw;
}
};
#define COUNT 9
class TimeWheel
{
FdBucket fdBuckets[COUNT];
int currentIndex;
int pre(){return currentIndex = (--currentIndex + COUNT)%COUNT;}
int next(){return currentIndex = (++currentIndex)%COUNT;}
const int & cur()const{return currentIndex;}
const int previous(){int pre = (cur() + COUNT -1)%COUNT;return pre;}
public:
void add(Fd * _fd)
{
FdBucket & _bucket = fdBuckets[previous()];
_bucket.add(_fd);
}
void OnTimer()
{
next();
fdBuckets[cur()].clearFds();
}
};
void Fd::readEvent()
{
if ( _manager )
{
_manager->readEvent(this);
}
}
void FdBucket::readEvent( Fd * fd )
{
std::vector<Fd *>::iterator it = std::find(fds.begin() , fds.end() , fd);
if(it != fds.end())
{
Fd * fd = *it;
fds.erase(it);
if (_manager)_manager->add(fd);
}
}
TimeWheel tw;
UINT_PTR timer_id = ::SetTimer(NULL , 0 , 1000 , NULL);
int _tmain(int argc, _TCHAR* argv[])
{
MSG msg;
while ( GetMessage(&msg , 0 , 0 , 0) )
{
if(msg.message == WM_TIMER)
{
tw.OnTimer();
}
else
{
//int fd = 1;//accept(listenfd);
//Fd * myFd = new Fd(fd);
//tw.add(myFd);
}
}
::KillTimer(NULL , timer_id);
return 0;
}
时间轮踢出超时用户
最新推荐文章于 2023-09-23 18:13:16 发布