📄 socketbase.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 + -