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

📄 socketbase.h

📁 线程池+socket
💻 H
字号:
/************************************************************** * SocketBase.h * Copyright 2004-2005 	Aven * All rights reserved.
 * socket基类,socket基本属性、线程池的创建;比较特别的是SelectMsg,此函数是
 * 阻塞函数,超时1ms,监听套接字的收发、连接,每次select返回,线程池又启动一个SelectMsg
 * 继续监听套接字;,保证线程池最起码有一个线程在监听端口。
 * * Contact info:
 * -------------
 * Site:   	   	http://zeng_aven.go.nease.net/
 * paid services:	zeng_aven@163.com
 *************************************************************/

#ifndef SOCKETBASE_H
#define SOCKETBASE_H

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <map>
#include <list>
#include <iterator>
#include <arpa/inet.h>
#include "ErrorLog.h"

#define NO_OnConnect	virtual bool OnConnect() {return true;}
#define NO_OnAccept	virtual bool OnAccept() {return true;}
#define NO_OnReceive	virtual bool OnReceive() {return true;}
#define NO_OnClose	virtual bool OnClose() {return true;}
#define NO_OnSend	virtual bool OnSend() {return true;}

typedef unsigned short int    UNIT;
//socket出错
#define SOCKET_ERROR	(-1)

//ShutDown输入参数
#define SOCK_SEND	0
#define SOCK_RECV	1
#define SOCK_CLOSE	2

//默认接收最大字节
#define MAXRECV		1024
//默认最大发生字节
#define	MAXSEND		1024

#define CSOCKETBAUSE	"CSocketBase"

class CThreadPool;

class CSocketBase : CErrorLog
{
public:
	CSocketBase();
	virtual ~CSocketBase();
	
	//每个新描述符都要加入链表
	bool 		AddSockInList();
	bool		AddAcceptInList();
	//创建套接字
	bool		Create(const int domain, const int type);
	//端口关联
	bool		Bind(const int port, struct sockaddr *addr);
	bool		Bind(int port);
	bool		Bind();
	//侦听
	bool		Listen(int backlog = 5);
			
	//关闭套接字
	bool		Close();
	bool		ShutDown(const int how);
	
	//添加套接字
	bool		Attach(int &sockfd);
	int		GetSocketId() const {return m_sock;}
	sockaddr_in	*GetSocketAddr() {return &m_addr;}
	bool		Gethostname(char *hostname, int size);
	bool		GetPeerName(char *fromaddr, UNIT &port);
	void		SetConnected(sockaddr_in &addr);
	
	//多路复用处理
	void		SelectMsg();
	//标识此套接字是否正在处理
	bool		IsBusy() const {return m_bBusy;}
	bool		SetBusy(const bool b) {m_bBusy = b;}
	
	bool		Is_valid() const {return m_sock != -1;}
	//设置阻塞或非阻塞
	void		Set_non_blocking(const bool b/*true非阻塞*/);
	
	//初始化线程池
	bool		InitThreadPool(int nThreadNum);
	void		SetThreadPool(CThreadPool *pThread) {m_pThreadPool = pThread;}
	CThreadPool	*GetThreadPool() const {return m_pThreadPool;}
	
protected:
	//判断套接字是否有东西到来
	class SocketIsSet
	{
		friend class CSocketBase;
	public:
		SocketIsSet(fd_set &rfd) : m_rfd(&rfd) {}
		~SocketIsSet(){}
		
		bool	operator ()(int &sockfd)
			{return FD_ISSET(sockfd, m_rfd);}
			
	private:
		fd_set 	*m_rfd;
		
	};
	
public:
	CSocketBase 	&operator = (const CSocketBase &sock);
	bool 		operator == (const CSocketBase &sock) const;
	virtual bool	OnReceive() = 0;
	virtual bool	OnAccept() = 0;
	virtual bool	OnConnect() = 0;
	
protected:
	//启动线程开始守护套接字
	void		BeginThread();
	//暂停线程
	void		StopThread();
		
private:
	//描述符链表
	typedef map<int, CSocketBase*>	t_mapSocket;
	typedef list<int>		t_listSocket;
	typedef t_mapSocket::iterator	t_imapSocket;
	typedef t_listSocket::iterator	t_iListSocket;
	
private:
	//套接字标识符
	int		m_sock;
	sockaddr_in 	m_addr;
	int		m_dsize;
	bool		m_bBusy;
	
	//描述符链表
	//保存创建套接字的描述符
	static	t_listSocket	m_listSock;
	static	t_mapSocket	m_mapSock;
		
	//保存Accept之后的描述符
	static	t_listSocket	m_listAccept;
	static	t_mapSocket	m_mapAccept;
	
	//线程池指针
	static	CThreadPool	*m_pThreadPool;
	//保存所以描述符的fd_set
	static	fd_set 		m_rfd;
};

#endif

⌨️ 快捷键说明

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