时间轮踢出超时用户
来源:互联网 发布:乐高nxt2.0编程软件 编辑:程序博客网 时间:2024/05/16 00:34
// 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 9class 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;}
0 0
- 时间轮踢出超时用户
- 相对超时时间和绝对超时时间
- Windows服务超时时间
- ASP.Net超时时间
- wcf设置超时时间
- WCF 设置超时时间
- socket设置超时时间
- 服务器上传,时间超时
- oracle设置超时时间
- httpclient4 超时时间
- 设置ssh超时时间
- 设置超时时间
- 设置connect超时时间
- 设置connect超时时间
- 设置系统超时时间
- ssh设置超时时间
- XMLHttpRequest设置超时时间
- 设置socket超时时间
- 4.C语言-----多个源文件
- TCP长连接与短连接的区别
- ORA-29701: unable to connect to Cluster Synchronization Service
- FrameAnimation帧动画
- 协议——ARP/RARP
- 时间轮踢出超时用户
- iOS打包成越狱用户能安装的ipa
- python 命令行安装apk
- 没有spring框架下,读取properties文件的办法
- iOS7 SDK新特性
- hadoop注意事项
- 命令行界面(CMD) 使用PING 等系统命令却无法识别?
- Delegate & Block
- linux远程管理的工具xshell和xftp