⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selector.h

📁 socket的事件分发模型
💻 H
字号:
#ifndef SELECTOR_H_
#define SELECTOR_H_

#include "fdset.h"
#include "skset.h"
#include <assert.h>

class ZBCDLL selector
{
public:	
	HRET create(size_t bufSize);						//	创建bufSize大小的select池
	HRET expand(size_t bufSize);						//	调整select池的大小
	HRET add(fdbase& fd, int events = FDEVENT_IN | FDEVENT_OUT);//	将一个fdbase加入select池,设定初始侦听事件为events
	HRET remove(int idx);								//	移除一个fdbase
	void clear();										//	清除所有的fdbase
	void destroy();
	size_t count() const;								//	select池内的fdbase个数
	size_t capacity() const;							//	select池的容量
	fdbase* get(int idx) const;							//	

	void set_events(int idx, int events);				//	FDEVENT_IN | FDEVENT_OUT | FDEVENT_ERR | ...
	void refresh();										//	刷新,取得各fdbase最新的读写许可
	
	HRET wait(const struct timeval* ptv);				//	侦测系统事件,并派送

#if zDEBUG
	void print_freeze() const;
#endif
	explicit selector(size_t bufSize = 1024);
	~selector(){
		clear();
	}
private:
	void dispatch_select(size_t cnt, fd_set* pr, fd_set* pw, fd_set* pe);
	void fill_set();
	void clr_set();
	void clr_fds();
private:
	fdset m_set;										//	fdbase集合
	int* m_pfds;										//	文件描述符数组,和m_set中的内容是一一对应的
	int* m_pevents;										//	事件数组
	sockset m_rset;										//	读集合
	sockset m_wset;										//	写集合
	sockset m_eset;										//	紧急数据集合
};

inline size_t selector::count() const
{
	return m_set.count();
}

inline size_t selector::capacity() const
{
	return m_set.capacity();
}

inline void selector::set_events(int idx, int events)
{
	assert(idx >= 0 && idx < (int)m_set.capacity());
	assert(m_pfds && m_pfds[idx] >= 0);
	m_pevents[idx] = events;
}

inline fdbase* selector::get(int idx) const
{
	return m_set.get(idx);
}

inline void selector::clr_set()
{
	m_rset.clear();
	m_wset.clear();
	m_eset.clear();
}

inline void selector::clr_fds()
{
	for(int i = m_set.capacity()-1 ; i >= 0 ; --i)
		m_pfds[i] = -1;
}

inline void selector::fill_set()
{
	m_rset.reset();
	m_wset.reset();
	m_eset.reset();
	size_t cnt = m_set.count();
	for(size_t i = 0 ; i < cnt ; ++i)
	{
		int fd = m_pfds[i];
		int events = m_pevents[i];

		if (fd >= 0){
			if (events & FDEVENT_IN){
				m_rset.add(fd);
			}
			if (events & FDEVENT_OUT){
				m_wset.add(fd);
			}
			if (events & FDEVENT_ERR){
				m_eset.add(fd);
			}
		}
	}
}

#endif //SELECTOR_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -